object - 为什么在Rebol2中动态添加代码到对象不生效?

标签 object append block rebol rebol2

这个问题是关于动态添加代码到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]

附件丢失!如果 append 到第一个o第二个o

,则相同

使用“通用” block 不会发生这种情况:

>> 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]

这是为什么?

最佳答案

第三个函数不返回原始对象规范,它返回从对象的单词和值生成的新的设置单词和值 block 。因此,您要 append 到该新 block (这会影响该 block ,但不会影响该对象)。

您无法获取对作为对象规范传入的原始 block 的系列引用。它在对象构造完成后就被扔掉了,而且无论如何它对对象都没有进一步的影响。因此,即使您已经保存了对传递给 make object 的 block 的引用, append 到它也不会对对象执行任何操作。

您根本无法在 Rebol 2 中 append 到对象。但在 Rebol 3 中,您可以 append 到对象:

>> 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。自 Rebol 2.7.7 发布以来,序数反射器已被弃用。 5 年前,已在 Rebol 3 中删除。)

关于object - 为什么在Rebol2中动态添加代码到对象不生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054644/

相关文章:

javascript - 向下和向上滚动时用 float block

python - "chunk"、 "block"、 "offset"、 "buffer"和 "sector"是什么意思?

java - hazelcast dataSerialized - 序列化对象数组

java - 对象和 ".class"使用

go - 追加不是线程安全的?

javascript - jQuery append 功能和调整大小

vb.net - 创建表单时出错。有关详细信息,请参阅 Exception.InnerException。错误是 : Object reference not set to an instance of an object

python - 如何从 Python 中的不同类访问使用一个类创建的对象

ios - append 两个数组给出 [__NSCFArray insertObject :atIndex:]: mutating method sent to immutable object'

css - { block :tags} + nth-child in <title> tags