7

次のREBOLコードを想像してください:

foo: コンテキスト [bar: 3]

が定義さfooれているコンテキストができました。'barこのコンテキストに新しい単語を動的に挿入するにはどうすればよいですか? 出来ますか?

私はもう試した:

set/any in foo 'baz 3

しかし、コンテキストで単語が定義されていないために式in foo 'bazが失敗するため、これは機能しません。'bazfoo

これを行う1つの方法は次のとおりであることを認識していることを付け加えておきます。

foo-prototype: [バー: 3]
foo: コンテキスト foo-prototype
foo: context head append foo-prototype [baz: 3]

fooしかし、のプロトタイプ ブロックにアクセスできない場合はどうなるでしょうか。

4

3 に答える 3

8

既存のオブジェクトをプロトタイプとして使用して新しいオブジェクトを作成することで、同じことを実現できます。

>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
    bar: 3
    baz: 3
]
于 2009-01-10T10:48:54.210 に答える
4

REBOL/2 ではオブジェクト コンテキストを拡張することができないという事実を回避するには、いくつかの方法があります。

おそらく、OBJECT! の代わりに BLOCK! を使用できます。

>> 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 WA 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! に単語を追加できます。

于 2009-01-10T19:41:56.910 に答える
1

REBOL / Coreユーザーガイドの説明:「多くのブロックには他のブロックや文字列が含まれています。そのようなブロックがコピーされると、そのサブシリーズはコピーされません。サブシリーズは直接参照され、元のブロックと同じシリーズデータです。 。」

于 2010-11-18T07:06:28.053 に答える