4D-jp 4D Japan Technical Support Team

未定義の参照と代入

2019-05-11

パラメーターが宣言されているメソッドの引数が省略された場合,そのパラメーター($1など)は「未定義」となります。v16では,変数やフィールドに「未定義」を代入しようとすると,エラーが返されました。v17以降,「未定義」を変数やフィールドに代入してもエラーは返されません。これは仕様です。

オブジェクト型のプロパティは,変数やフィールドとは違い,型が決まっていません。値またはNullが代入されていないプロパティは,省略されたパラメーターと同じように「未定義」です。

オブジェクト記法を使用すれば,プロパティのプロパティにアクセスするコードがずっとシンプルで直感的になるだけでなく,実行速度も大幅に向上させることができます。しかし,プロパティのプロパティにアクセスするコードが成立するためには,上位のプロパティが「未定義」でなければなりません。

深い階層のプロパティに1行でアクセスするために,ひとつずつプロパティをチェックしなければならないとすれば,それは本末転倒であり,オブジェクト記法を使用するメリットがありません。それで,v17以降,「未定義」の参照と代入に関する仕様が変更され,より柔軟に「未定義」を扱うことができるようになりました。オブジェクトのプロパティだけでなく,省略されたパラメーターにも影響が及びます。

https://blog.4d.com/object-notation-improvement-after-customer-feedback/

  • オブジェクト記法で参照したプロパティが「未定義」

v16r4まで

エラーが返されました。

v17から

オブジェクト記法で参照したプロパティが「未定義」だった場合,式は「未定義」を返し,以降のコードは無視されます。つまり,途中のプロパティをすべてチェックする必要がなくなりました。

  • プロジェクトメソッドに渡された引数が「未定義」

v16まで

パラメーター($1など)は「未定義」でした。

v17から

パラメーター($1など)には,型のデフォルト値(0など)が代入されます。

注記: コマンドに「未定義」を渡すことはできません。引数が「未定義」になる可能性があるのであれば,String Num Date Time Boolを使用することができます。v17以降,「未定義」は型のデフォルト値に変換されるからです。

  • 条件文(If Case ofなど)の式が「未定義」

v16まで

エラーが返されました。

v17から

False条件として扱われます。

  • 代入演算子(:=)の右オペランドが「未定義」

v16まで

値を返さないメソッド($0なし)や未定義のプロパティ($o.undefined)を変数やフィールドに代入するようなコードは何もしませんでした。つまり,値は元のままでした。

v17から

値を返さないメソッド($0なし)や未定義のプロパティ($o.undefined)を変数やフィールドに代入した場合,左オペランドには型のデフォルト値(0など)が代入されます。


関連記事

リンク