变量绑定

时间:2013-02-16 03:58:41

标签: ruby scope

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

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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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模块,类和方法揭示了它们对层次结构低于它们的对象的绑定,但不是相反,除非它们是通过公共实例方法等明确显示的。这有点过于简单化了,但是如果你不熟悉编程,那么就没有必要深入研究它。