3

在解释器中:

>>  qurl: "1234"
== "1234"

>> R: make object! [probe qurl qq: qurl probe qq]
"1234"
"1234"
== make object! [
    qq: "1234"
]

这表现得像我预期的那样。默认情况下,所有“变量”或“单词”都是全局的。

使用脚本:

REBOL []

qurl: "1234"

Q: make object! [
    probe join "[Q before qq] qurl: " qurl
    qq: qurl
    probe join "[Q] qq: " qq
    qurl: qurl
    probe join "[Q after qurl] qurl: " qurl
]
probe join "[main before Q] qurl: " qurl
Q
probe join "[main after Q] qurl: " qurl

返回:

"[Q before qq] qurl: none"
"[Q] qq: none"
"[Q after qurl] qurl: none"
"[main before Q] qurl: 1234"
"[main after Q] qurl: 1234"

我希望probe里面的所有内容Q object!都会返回"1234",但没有人这样做。

这是为什么?

4

1 回答 1

4

当 Rebol 创建一个对象时,它首先从规范中收集(set-)单词并使用它们来创建新对象。新对象的单词最初分配给none。然后将规范绑定到新对象并进行评估。

在您的第一个示例中,您没有包含qurl:在规范中,因此不是您的对象的一部分。相反,您会得到 'global' qurl。在您的第二个示例中,qurl 您的对象的一部分,并以none.

qurl您在第二个示例中访问与“全局”关联的值的选项是:

1. 组合块,以便在评估块时直接访问值:

Q: make object! compose [
    qq: (qurl)
    qurl: (qurl)
]

2. 从“全局”上下文中访问单词:

Q: make object! [
    qq: system/words/qurl ; Rebol 2
    qq: system/contexts/user/qurl ; Rebol 3
]
于 2015-07-08T19:20:27.360 回答