有几种方法可以解决在 REBOL/2 中无法扩展对象上下文这一事实。
可能你可以只使用 BLOCK!s 而不是 OBJECT!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 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!s 添加单词。