2013-02-16 105 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