2

这个问题是关于动态地将代码添加到 rebol 2 中的上下文或对象,它与问题Dynamically add 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]

为什么是这样?

4

1 回答 1

5

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代替firstvalues-of代替secondbody-of代替third。序号反射器自 5 年前发布的 Rebol 2.7.7 以来已被弃用,并已在 Rebol 中删除3.)

于 2014-02-26T22:28:44.103 回答