2013-02-16 82 views
2

我不确定我是否理解变量绑定的含义。这可能是一个不特定于Ruby的编程概念。它几乎看起来像是一个基本的概念,有些书希望你已经知道这意味着什么。变量绑定

到目前为止我的理解是: 每当一个Ruby对象被实例化时,这实际上意味着Ruby在内存中分配一个空间来指定这个对象。如果将一个对象分配给一个变量,则实际上并不是将该对象存储在该变量中,而是将该对象的引用存储在该变量中。我认为绑定是指这个概念,其中的变量“绑定”到与它相关联的对象,但我不完全确定这是否代表绑定和绑定的含义。

有人可以帮我解释一下,如果可能,最好通过使用一个简单的例子?

回答

2

您在第二段中提到的概念是关于指针,并且与绑定没有直接关系。

正如您所注意到的,绑定不是特定于Ruby的。这是一个广泛用于正式处理语言(包括编程语言和自然语言)的术语。有些表达式有其固定的含义,在编程语言中称为常量,在自然语言中使用专有名词(或者,偶然的美国人也称它为名称)。相反,表达式并不是单独引用任何东西,而是需要以某种方式赋值。这些在编程语言中称为变量,在自然语言中称为代词。

在变量未被赋值的上下文中,变量被认为是空闲的。否则,变量被绑定。下列表达式中的变量x是免费的。

x**2 

有几种方法可以绑定变量。一种方法是分配。在下面,x已在第一行中分配了值3,因此它在范围内被绑定。

x = 3 
x**2 

另一种方法是量化它。在下面,块内的x受其外部的x约束。无论外部x需要的值是内部x的值。

->x{x**2} 

在另一方面,在上述表达式中的外x未绑定。通过将proc与下面的某个值进行调用,它就会变得有束缚。

->x{x**2}.call(3) 
+0

感谢您的解释!根据你所说的,似乎变量绑定是特定于范围的权利?我的意思是,当你谈论变量绑定时,你必须提供范围作为上下文才能使其有意义。 – wmock 2013-02-16 04:53:00

+0

@WillsonMock这是正确的。 – sawa 2013-02-16 04:58:01

1

想一想,它的一个好方法是绑定是封装上下文的对象。您可以使用关键字binding揭示绑定对象:

a = 10 # a is defined in the 'main' context 
def get_binding # so is the 'get_binding' method 
    b = 20 
    binding 
end 

n = get_binding #=> #<Binding:0x00...> 

现在,因为get_bindingmain范围内确定,返回的绑定对象包括方法的当地情况,以及主要范围内任何东西。变量bmain中不可用,而aget_binding中可用。

您可以通过使用eval绑定对象交互证明这一点:

a #=> 10 
eval('a', n) #=> undefined local variable or method 'a' for main:Object 

b #=> undefined local variable or method `b' for main:Object 
eval('b', n) #=> 20 # but it is defined within the context the n binding was created. 

只是为了澄清 - 这个例子只是揭示了幕后发生了什么。如果有的话,你将很少需要直接处理绑定对象。

Ruby模块,类和方法揭示了它们绑定到比它们低的层次结构的对象,但不是相反,除非它们通过公共实例方法等明确公开。这是一种过分简单化,但如果你不熟悉编程,就没有必要深入了解这一点。

+0

我不确定我得到以下声明:“变量b在main中不可用,而a在get_binding中可用。”根据我对范围的理解,变量a不应在get_binding方法中可用。另外,当我为eval('a',n)执行你的例子时,我得到一个错误:NameError:未定义的局部变量或方法'a'为main:Object。我在这里错过了什么吗? – wmock 2013-02-16 05:02:18

+0

不,你说得对 - 我的错误。返回的绑定对象仅在其上下文中是本地的(显然,我并不经常使用它们)。我已经编辑了更有意义的答案。 – 2013-02-16 05:53:48