記事一覧

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

先に結論を画像で

ファイル 62-1.png

便利な関数TOAUTO

YAYAにはTOAUTOというとても便利な関数があります。

YAYAには「文字列型」と「数値型」の2種類の変数の型が存在し(配列とかは除く、厳密には整数型と実数型に分かれる)、扱いが全く異なります。

{
  1 + 1     // => 2 (数値型)
  --
  '1' + '1' // => '11' (文字列型)
}

数値型に変換できる文字列は数値型に、そうでないものは文字列型のまま返す関数がTOAUTOです。

{
  TOAUTO('123')  // => 123 (数値型)
  --
  TOAUTO('hoge') // => 'hoge' (文字列型)
}

便利ですね。

TOAUTOの何が危険なの?

例えばこんな場合
{
  TOAUTO('0123')  // => 123 (数値型)
}

'0'が何処かへ行ってしまいました。これでは困ります。
これは文字列のままにして欲しいケースが考えられます。
(ユーザ名とかパスワードとか)

TOAUTO使わなきゃいいじゃん

お好きなYAYAゴーストを立たせてユーザ名を'0123'と教えてあげて下さい。
9割方「123さん」として覚えられてしまいます。TOAUTOなんて使った覚えも無いのに。

これはYAYAのせいではなく、現在広く普及しているYAYAミドルウェアでSHIORIリクエストの値がデフォルトでTOAUTOを経由させてしまっていることに起因します。referenceを参照した時点で既に'123'に書き換えられているのです。(ウチのGHOSTもだよ!/(^o^)\)

どうすればいいの?

「はろーYAYAわーるど」を例にすると、yaya_shiori3.dicの412行目にTOAUTOを使っているので、これをやめることです。(SHIORI3FW.AUTO_DATA_CONVERTをOFFにしているという前提の話)
でもreferenceの値が自動で型変換されているという前提で今まで辞書を書いていた場合GHOSTがまともに動かなくなるでしょう。それは困ります。

なので、こんな方法で回避しては如何でしょうか。

{
  _value = '0123'
  if TOSTR(TOAUTO(_value)) == _value {
    var.req.value ,= TOAUTO(_value)
  }
  else {
    var.req.value ,= _value
  }
}

再度文字列として評価したときに元々の文字列と一致した場合のみ数値に変換。そうでない場合は文字列のまま。

今のところ困ってないしそこまでする必要あるの?

必要ないと思います。必要になったときに対策しましょう。

余談

AYA as SAORIのシステム辞書はTOAUTOを使っていません(AYA5にはTOAUTO無いのかな?)。数値と評価され得る場合もreferenceレベルでは文字列として参照されます。