这个问题是关于在rebol 2中动态地向上下文或对象添加代码,它与问题Dynamically adding words to a context in REBOL有关,但不是相同的类型。
如果我想使用rebol对象的代码块动态地添加代码,我就会因为奇怪的行为而陷入麻烦:
>> append third o [c: 3]
== [a: 1 b: 2 c: 3]但是..。
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
>> third o
== [a: 1 b: 2]附件不见了!如果附加到first o或second o中,则相同
使用“公共”块不会发生这种情况:
>> m: [a [b] c]
== [a [b] c]
>> append m 3
== [a [b] c 3]
>> m
== [a [b] c 3]
>> append second m 1
== [b 1]
>> m
== [a [b 1] c 3]这是为什么?
发布于 2014-02-26 22:28:44
third函数不返回原始对象规范,它返回由对象的单词和值生成的一个新的集合词和值块。因此,您将附加到该新块(这会影响到块,但不会影响对象)。
您无法获得作为对象规范传入的原始块的序列引用。在构造对象之后,它就被丢弃了,而且它对对象没有任何进一步的影响。因此,即使您保存了对传递给make object的块的引用,附加到它也不会对对象做任何事情。
您不能在Rebol 2中追加对象,但在Rebol 3中,您可以追加到对象:
>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
a: 1
b: 2
c: 3
](注意:不要使用Rebol 2中的序号反射器。使用words-of代替first__,使用values-of代替second__,使用body-of代替third__。自5年前推出的Rebol 2.7.7以来,顺序反射器已被废弃,并在Rebol 3中被移除。)
https://stackoverflow.com/questions/22054644
复制相似问题