2

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

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

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

4

2 回答 2

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)
于 2013-02-16T04:26:38.123 回答
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上下文中定义,返回的绑定对象包括方法的本地上下文以及主上下文中的任何内容。该变量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 模块、类和方法显示它们与层次结构比它们更低的对象的绑定,但不是相反,除非它们通过公共实例方法等显式显示。这有点过于简单化了,但事实并非如此如果您是编程新手,有必要深入了解这一点。

于 2013-02-16T04:35:10.010 回答