【小技】オブジェクトのマージ
【小技】オブジェクトのマージ
現在ベータ公開中で,リリース日が近づいている16R3の新コマンド「OB new」がなかなか好評です。
4D FORUMS http://forums.4d.fr/Post/DE/18642977/1/18642978
ブログ:http://blog.4d.com/ob-new-an-easy-way-to-initialize-an-object/
C_OBJECTは参照型なので,これまで下記のようなコードでインスタンスを作成する必要がありました。
C_OBJECT($obj)
$obj:=JSON Parse ("{}")
JSON Parseを省略した場合,メソッドのローカル変数としてはオブジェクトが使用できますが,そのオブジェクトをサブルーチンに渡した場合,受け取り側にはコピーが作られ,返り値やポインターを使用して代入しない限り,元のオブジェクトに内容を反映させることはできません。
JSON Parseを使用した場合,新しいオブジェクトのインスタンスが作られるので,そのオブジェクトをサブルーチンに渡した場合,受け取り側には「参照」が渡され,直接,同じオブジェクトを読み書きすることができます。そのようなわけで,C_OBJECTのコーディングでは,JSON Parse ("{}") を実行することが少なくありません。
OB Newを利用すれば,新しいオブジェクトのインスタンスを明示的に作成することができます。
C_OBJECT($obj)
$obj:=OB New
加えて,初期プロパティを引数で設定することもできます。
C_OBJECT($obj)
$obj:=OB New("foo";"bar")
プロパティはオブジェクトであっても構いません。
$obj1:=OB New("foo";"bar")
$obj2:=OB New("foo2";"bar2";"foo3";$obj1)
ところで
既存のオブジェクトを「合成」して新しいオブジェクトを作成したい,というご要望がありました。
たとえば,オブジェクト型のパラメーターを受け取るようなメソッドで,特に指定がなかった場合はデフォルトのオブジェクトを使用し,指定があった場合には,その部分のみ,パラメーターを上書きするような使い方をイメージしています。
フィーチャーリクエストURL
http://forums.4d.fr/Post//19466427/1/
もっとも,下記のようなメソッドを記述すれば,既存のコマンドで同等のことができます。
4D FORUMS http://forums.4d.fr/Post/DE/18642977/1/18642978
ブログ:http://blog.4d.com/ob-new-an-easy-way-to-initialize-an-object/
C_OBJECTは参照型なので,これまで下記のようなコードでインスタンスを作成する必要がありました。
C_OBJECT($obj)
$obj:=JSON Parse ("{}")
JSON Parseを省略した場合,メソッドのローカル変数としてはオブジェクトが使用できますが,そのオブジェクトをサブルーチンに渡した場合,受け取り側にはコピーが作られ,返り値やポインターを使用して代入しない限り,元のオブジェクトに内容を反映させることはできません。
JSON Parseを使用した場合,新しいオブジェクトのインスタンスが作られるので,そのオブジェクトをサブルーチンに渡した場合,受け取り側には「参照」が渡され,直接,同じオブジェクトを読み書きすることができます。そのようなわけで,C_OBJECTのコーディングでは,JSON Parse ("{}") を実行することが少なくありません。
OB Newを利用すれば,新しいオブジェクトのインスタンスを明示的に作成することができます。
C_OBJECT($obj)
$obj:=OB New
加えて,初期プロパティを引数で設定することもできます。
C_OBJECT($obj)
$obj:=OB New("foo";"bar")
プロパティはオブジェクトであっても構いません。
$obj1:=OB New("foo";"bar")
$obj2:=OB New("foo2";"bar2";"foo3";$obj1)
ところで
既存のオブジェクトを「合成」して新しいオブジェクトを作成したい,というご要望がありました。
たとえば,オブジェクト型のパラメーターを受け取るようなメソッドで,特に指定がなかった場合はデフォルトのオブジェクトを使用し,指定があった場合には,その部分のみ,パラメーターを上書きするような使い方をイメージしています。
フィーチャーリクエストURL
http://forums.4d.fr/Post//19466427/1/
もっとも,下記のようなメソッドを記述すれば,既存のコマンドで同等のことができます。
- Code:
C_OBJECT(${1})
C_OBJECT($0)
If (Count parameters#0)
$dst:=OB Copy($1)
For ($i;2;Count parameters)
$src:=${$i}
OB GET PROPERTY NAMES($src;$names;$types)
For ($j;1;Size of array($names))
OB SET($dst;$names{$j};OB Get($src;$names{$j};$types{$j}))
End for
End for
$0:=$dst
End if
miyako- 投稿数 : 487
登録日 : 2016/07/05
Permissions in this forum:
返信投稿: 不可