質問
次のREBOLコードを想像してください:
foo: context [bar: 3]
'bar
が定義されているコンテキスト foo
があります。このコンテキストに新しい単語を動的に挿入するにはどうすればよいですか?可能ですか?
試しました:
set/any in foo 'baz 3
ただし、 foo
コンテキストに単語 'baz
が定義されていないため、式 foo' baz
が失敗するため、機能しません。
これを行う方法の1つは次のとおりであることを理解しておく必要があります。
foo-prototype: [bar: 3] foo: context foo-prototype foo: context head append foo-prototype [baz: 3]
しかし、 foo
のプロトタイプブロックにアクセスできない場合はどうなりますか?
解決
既存のオブジェクトをプロトタイプとして使用して新しいオブジェクトを作成することで、同じことを実現できます。
>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
bar: 3
baz: 3
]
他のヒント
REBOL / 2ではオブジェクトコンテキストを拡張することが不可能であるという事実を回避する方法がいくつかあります。
おそらくOBJECT!sの代わりにBLOCK!sを使用できます:
>> blobject: [foo 1]
== [foo 1]
>> blobject/bar
** Script Error: Invalid path value: bar
** Near: blobject/bar
>> append blobject [bar 2]
== [foo 1 bar 2]
>> blobject/bar: 3
== 3
オブジェクト自体を追加するだけで、 'selfを動作させることもできます:
>> insert blobject reduce ['self blobject]
== [[...] foo 1 bar 2]
>> same? blobject blobject/self
== true
しかし、あなたが OBJECT!s を拡張することを求めたように、あなたは単純にオブジェクトを複製するPeter W A Woodのソリューションに行くかもしれません。このアプローチでは、結果のクローンは実際には元のオブジェクトとは異なることに注意してください。
したがって、クローニング/拡張の前にオブジェクトを保持するように何らかの単語が設定されている場合、オブジェクトを複製した後、その単語は未拡張オブジェクトを保持します:
>> remember: object: make object! [foo: 1]
>> object: make object [bar: 2]
>> same? remember object
== false
>> probe remember
make object! [
foo: 1
]
「参照」を保持することが不可欠である場合そのままオブジェクトに、拡張する必要があるオブジェクトを次のように外側のオブジェクトにラップすることができます。
>> remember: object: make object! [access: make object! [foo: 1]]
>> object/access: make object/access [bar: 2]
>> same? remember object
== true
コンテナへの参照のみを保存すれば、保存しながらオブジェクトを拡張できます。
REBOL / 3、ところで、OBJECT!sに単語を追加できます。
REBOL / Coreユーザーガイドの説明: "多くのブロックには、他のブロックと文字列が含まれています。そのようなブロックがコピーされると、 サブシリーズはコピーされません。サブシリーズは直接参照され、同じです 元のブロックとしての系列データ"