如何使用其字符串名称调用对象函数

时间:2012-02-08 15:42:33

标签: rebol rebol3

知道为什么以下不起作用? (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]

3 个答案:

答案 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中的单词只有在静态绑定到上下文后才有意义。当你制作一个物体时,这会自动发生,所以即使经过多年的使用,很多人甚至都没有意识到这一点。

以下是创建对象(a.k.a。上下文)时的步骤(松散)。

  • 它获取其规范中的所有根集词(在本例中为[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到一个块。 我们附加到块中的所有单词都带有它们自己的上下文,但它们看起来相同。

当我们减少(或打印等)时,当我们在他们自己的情境中获取他们的价值时,我们发现他们都有不同的价值观!