我不确定我是否理解变量绑定意味着什么。这可能是一个不特定于Ruby的编程概念。这似乎是一个基本概念,有些书籍希望你已经知道这意味着什么。
到目前为止,这是我的理解: 每当Ruby对象被实例化时,这实际上意味着Ruby在内存中分配一个空间来指定这个对象。如果将对象分配给变量,则实际上并不是将对象存储在变量中,而是将该对象的引用存储在变量中。我认为绑定是指这个概念,其中变量“绑定”到与之关联的对象,但我不完全确定它是否代表绑定和绑定的含义。
有人可以帮我向我解释一下,如果可能的话,最好通过一个简单的例子来解释吗?
答案 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_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模块,类和方法揭示了它们对层次结构低于它们的对象的绑定,但不是相反,除非它们是通过公共实例方法等明确显示的。这有点过于简单化了,但是如果你不熟悉编程,那么就没有必要深入研究它。