想象一下以下REBOL代码:
foo: context [bar: 3]
我现在有一个上下文foo
,其中定义了'bar
。如何在此上下文中动态注入新单词?有可能吗?
我试过了:
set/any in foo 'baz 3
但这不起作用,因为表达式in foo 'baz
失败,因为'baz
上下文中没有定义单词foo
。
我应该补充一点,我知道有一种方法可以做到这一点:
foo-prototype: [bar: 3] foo: context foo-prototype foo: context head append foo-prototype [baz: 3]
但是,如果您无法访问foo
的原型块呢?
答案 0 :(得分:8)
您可以通过使用现有对象作为原型来创建新对象来实现相同目的。
>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
bar: 3
baz: 3
]
答案 1 :(得分:4)
有几种方法可以解决这样一个事实:在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
你甚至可以通过追加对象本身来实现自我工作:
>> 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添加单词!
答案 2 :(得分:1)
在REBOL /核心用户指南中说: “许多块包含其他块和字符串。当复制这样的块时,它的 子系列不会被复制。子系列直接引用并且是相同的 系列数据作为原始块。“