我不确定我是否理解了变量绑定的含义。这可能是一个并非特定于Ruby的编程概念。这似乎是一个基本的概念,有些书希望你已经知道这是什么意思。
到目前为止,我的理解是:每当Ruby对象被实例化时,这实际上意味着Ruby在内存中分配一个空间来指定这个对象。如果您将一个对象赋给一个变量,那么实际上您并没有将该对象存储在变量中,而是将对该对象的引用存储在了变量中。我认为绑定是指将变量“绑定”到与其关联的对象的概念,但我不能完全确定这是否代表绑定和绑定的含义。
有没有人能帮我解释一下,如果可能的话,最好是用一个简单的例子?
发布于 2013-02-16 12:26:38
您在第二段中提到的概念是关于指针的,与绑定没有直接关系。
正如您注意到的,绑定并不是特定于Ruby的。它是一个在语言的形式处理中广泛使用的术语,包括编程语言和自然语言。有些表达式有自己的固定含义,在编程语言中称为常量,在自然语言中称为专有名词(或者,普通美国人也称其为名称)。相反的是,表达式本身并不引用任何东西,但需要以某种方式为其赋值。这些在编程语言中称为变量,在自然语言中称为代词。
在没有为变量赋值的上下文中,变量被称为空闲的。否则,该变量将被绑定。以下表达式中的变量x是自由的。
x**2有几种方法可以绑定变量。一种方法是赋值。在下面的代码中,在第一行中为x分配了一个值3,因此它被绑定在作用域中。
x = 3
x**2另一种方法是对其进行量化。在下面的代码中,块内的x由块外的x绑定。无论外部x取什么值,都将是内部x的值。
->x{x**2}另一方面,上面表达式中的外部x没有绑定。如下所示,通过对某个值调用proc,它将被绑定。
->x{x**2}.call(3)发布于 2013-02-16 12:35:10
考虑这个问题的一个好方法是,绑定是封装上下文的对象。您可以使用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_binding是在main上下文中定义的,因此返回的绑定对象包括方法的本地上下文和主上下文中的任何内容。变量b在main中不可用,而a在get_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模块、类和方法将它们绑定到层次结构比它们更低的对象,但反之亦然,除非它们通过公共实例方法等显式地显示出来。这有点过于简化,但如果您是编程新手,就没有必要深入了解这一点。
https://stackoverflow.com/questions/14906772
复制相似问题