2014-02-26 77 views
2

這個問題是關於動態添加代碼到上下文或rebol 2中的對象,它與問題Dynamically adding words to a context in REBOL有關,但它不是同一種類。爲什麼不動態添加代碼到對象在Rebol2中生效?

如果我想使用它的代碼塊我遇到了麻煩,由於怪異的行爲得到了動態代碼添加到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 osecond 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] 

這是爲什麼?

回答

5

third函數不返回原始對象規範,它返回從對象的單詞和值生成的一組新的設置詞和值。所以你追加到新塊(它影響塊但不影響對象)。

您無法獲取作爲對象規範傳入的原始塊的系列引用。它在物體被構造後被拋棄,並且對物體沒有進一步的影響。所以,即使你已經保存了你傳給make object的塊的引用,追加到它也不會對對象做任何事情。

你根本無法追加到對象雷博爾2.但在雷博爾3,您可以附加到對象:

>> append make object! [a: 1 b: 2] [c: 3] 
== make object! [ 
    a: 1 
    b: 2 
    c: 3 
] 

(注意:不要在Rebol的使用順序反射2.使用words-of代替firstvalues-of代替second,並body-of而不是third。因爲雷博爾2.7.7,出來5年前的序反射器已被否決,並在雷博爾3已被刪除)

相關問題