知道为什么以下不起作用? (R3)
o: make object! [
foo: does [do "bar"]
bar: does [print "hello from bar"]
]
o/foo
** Script error: bar has no value
** Where: catch either -apply- do foo
** Near: catch/quit either var [[do/next data var]] [data]
答案 0 :(得分:3)
试试这个:
o: make object! [
foo: does [do get bind load "bar" self]
bar: does [print "hello from bar"]
]
o/foo ;this will work
你需要BINDing,因为你的“bar”存在于对象中,而不是全局范围内。
同时检查一下:
my-func: does [print "ok"]
o: make object! [
foo: does [do "my-func"]
bar: does [print "hello from bar"]
]
o/foo ;this will work too
你需要加载它,因为它是一个字符串,但它必须是一个单词才能被绑定。 所以这些也会起作用(把它们放在你的对象中):
do get bind to-word "bar" self
或
do get bind 'bar self
答案 1 :(得分:3)
“self / bar”之所以无法知道在哪里找到'BAR是因为 Rebol中没有范围 (至少在传统的CS中没有意义) 。
Rebol中的单词只有在静态绑定到上下文后才有意义。当你制作一个物体时,这会自动发生,所以即使经过多年的使用,很多人甚至都没有意识到这一点。
它获取其规范中的所有根集词(在本例中为[FOO:BAR:])
将它们添加到当前的内部单词(SELF:默认情况下,如果您使用对象作为基础,则更多)
然后将块中的所有单词(hierarchyicaly)绑定到它添加到其规范中的那些单词。
执行阻止。
所以你看,一旦你执行了它太迟了,已经分配了它们的含义,这允许解释器询问它们的值(这可能触发表达式评估,因此REBOL中的E)。
DO和LOAD不能自动绑定到除全局上下文之外的任何东西......因为没有像传统OOP和命令式语言中那样的“当前上下文”(记住,没有范围)。实际上,一旦执行,该信息就不再存在,除非你将“当前”上下文绑定到一个单词......这就是'SELF所做的,但是要绑定它必须已经加载,这在执行时一个字符串,从未出现过。
我将首先补充说,乍一看可能不是很明显,但是当它绑定了Object spec块时,它仍然不知道FOO和BAR到底是什么。事实上,FOO和BAR可以访问'O对象的唯一方法是,因为它们的功能块,当它通过'MAKE运行时,被绑定到对象...是的,甚至在它知道它是一个函数之前。那么如果函数定义了它自己的局部变量,它会将它的主体块重新绑定到那些新的局部变量..因为你猜对了......一个函数创建了自己的内部上下文,它获得相同的MAKE处理(但没有内部SELF)字)。
我希望这有助于以更明显的方式清除事物。
这里是代码没有作用域的证明:
a: make object! [
data: "HAHAHAAAAA!!!"
action: does [print self/data]
]
b: make object! [
data: "BUMBLING BEHEMOT"
action: does [print self/data]
]
b/action: get in a 'action
; this will print HAHAHAAAAA!!!
b/action
答案 2 :(得分:1)
要解释莫利亚德的答案,请参阅以下说明:
REBOL单词带有对它们的上下文的引用。不是 评估哪个单词会产生差异,但会在哪里进行评估 声明。
来自http://blog.revolucent.net/2009/07/deep-rebol-bindology.html
这是一个非常好的例子:
x: 0
b: [] loop 3 [use [x] [x: random 100 append b 'x]]
;== [x x x] <-- there are three X which looks same words (and they are same actually)
reduce b
;== [95 52 80] <-- but they have different values in their contexts
probe x
;== 0 <-- in global context, it has another value as well
初看起来看起来很奇怪,但事实并非如此。 USE每次在LOOP中创建一个新的上下文,我们将X(在USE创建的上下文中)设置为一个值,然后将WORD(不是值!)APPEND到一个块。 我们附加到块中的所有单词都带有它们自己的上下文,但它们看起来相同。
当我们减少(或打印等)时,当我们在他们自己的情境中获取他们的价值时,我们发现他们都有不同的价值观!