访问对象内的单词值

时间:2015-07-08 14:41:34

标签: object scope rebol rebol3 red

在翻译中:

osgi.configuration.area
@user.home/Updater/configuration

osgi.instance.area
@user.home/Updater/workspace

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

使用脚本:

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

为什么?

1 个答案:

答案 0 :(得分:4)

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

在您的第一个示例中,您未在规范中包含qurl:,因此不属于您的对象。而是获得“全球”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
]