記事一覧

YAYAの関数ISVARはちょっと危険

ISVARとは何か

指定した名前の変数が存在しない場合に0, グローバル変数が存在する場合に1, ローカル変数が存在する場合に2 を返す関数です。変数の存在の有無の判定に用いられます。

ISVARの何が危険なの?

YAYAに限らず里々や華和梨においても、「変数の削除」をする際には「変数に空文字を代入する」という手法がよく用いられると思います。YAYAでも空文字を代入して終了すればセーブデータにも残らず次回起動時に変数は存在しないことになります。YAYA Tc538-3 にて空文字が代入された変数もセーブ対象に変更されました。(2010/01/21 追記)

でも実は空文字を代入しても変数は消えないのです。次の例を見てみましょう。

{
  hoge = 1          // 変数を作成
  --
  ISVAR('hoge')     // => 1
  --
  hoge != ''        // => 1
  --
  hoge = ''         // 変数に空文字を代入
  --
  ISVAR('hoge')     // => 1
  --
  hoge != ''        // => 0
  --
  ERASEVAR('hoge')  // 変数を明示的に削除
  --
  ISVAR('hoge')     // => 0
  --
  hoge != ''        // => 0
}

変数に空文字を代入した場合でもISVARは1を返します。本当の意味で変数を削除するためには専用の関数ERASEVARを使わなければならないのです。
明示的にERASEVARで削除した後にISVARの戻り値が0になっているのがわかると思います。また、削除後の変数と空文字との比較で、存在しない変数と空文字を比較すると真となることも確認できます。

しかしYAYAは空文字が代入されている変数をセーブデータに保存するようなことはしません。次回起動時には空文字が代入された変数は自動的に綺麗に消されてしまうので、「空文字の代入で変数が削除される」と誤解される方も多いと思われます。YAYA Tc538-3 にて空文字が代入された変数もセーブ対象に変更されました。

どうすればいいの?

空文字が代入される度にそれを検出してERASEVARで削除する、なんて煩わしいやり方は褒められたものではないので、ISVARを使わずに、空文字との比較で判定するのが良さそうです。
例えばユーザ名を入力してもらった時に空打ちされた場合、変数に空文字が入った状態ですのでISVARで判定すると「ユーザ名が入力されている」と誤判定する恐れがあります。また、初回起動などの本当に変数がまだ存在しない場合でも空文字と比較すれば存在の判定は可能です。