2015-12-11 49 views
-1

能有人給實例的一個明顯的例子,其中lateearly binding發生在Ruby中?紅寶石通常是遲綁定還是早綁定?當一個函數被調用在Ruby中的對象上會發生什麼?它是否已經知道在運行時該方法將駐留在內存中?幕後發生了什麼?後期和早期綁定在Ruby中

在像C#這樣的語言中,除非消耗Reflection API,否則它總是早期綁定的。在Java中,後期綁定正常發生。

修訂

什麼這個案子?是遲到還是早綁定?

def create_something(klass, *args) 
klass.new(*args) 
end 
my_foo = create_something(Foo) 
+0

我認爲這是所有後期綁定。當然沒有像C#一樣。 –

+0

檢查我的更新爲我正在談論的場景 – mhaseeb

+0

'Foo'可能甚至沒有參數化的構造函數,並且在加載此代碼時ruby不會抱怨。它只會在運行時失敗(如果你要傳遞一些參數,那就是) –

回答

3

有人可以給出一個清楚的例子,在Ruby中發生遲和早綁定的情況嗎?請問紅寶石一般後期綁定或早期綁定?

如果我們參考this SO discussion中的這些術語,我寧願說Ruby傾向於「遲到」綁定。由於Ruby是一種動態語言,代碼在運行時進行評估,因此沒有編譯器可以執行此項工作。即使出現錯誤,在執行代碼之前也不會產生異常。

它已經知道運行時的函數將駐留在內存中嗎?

正如你可能已經知道Ruby中的所有東西都是一個對象,甚至是類和模塊。一個對象本身就是一堆實例變量和一個指向另一個對象的類的鏈接。這樣我們有一個一直到BasicObject這是Ruby的根對象,並沒有任何祖先。

通常,對象的方法駐留在對象的類中。但是,在繼承的情況下,事情變得更加複雜,其中也可以在對象本身上調用某些父類的方法。

class A 
    def a_method 
    p "called from a_method" 
    end 
end 

class B < A 
    def b_method 
    p "called from b_method" 
    end 
end 

obj = B.new 
obj.b_method # => called from b_method 
obj.a_method # => called from a_method 

所以,這個問題的答案是沒有每一個特定的對象上的方法調用完成時,紅寶石進行所謂的方法查找

當在Ruby中的對象上調用函數時會發生什麼?幕後發生了什麼?

方法查找是一個過程,其中紅寶石進入到類接收機的再向上祖先鏈,直至找到的方法或到達鏈的末端。爲了說明這一點:

       BasicObject 
           ^
            | 

           ... 

           ^
            | 
           ---------- 
           | A | 
           ---------- 
           |a_method| 
           ---------- 
           ^
            | 
           ---------- 
           | B | 
       obj -------> ---------- 
           |b_method| 
           ---------- 

希望我幫你:)

0

有人可以給實例的一個明顯的例子,其中後期和早期綁定發生在Ruby中?

  • 後期綁定:總是
  • 早期綁定:從不

不紅寶石一般後期綁定或早期綁定?

它總是晚結合。

當在Ruby中的對象上調用函數時會發生什麼?它是否已經知道在運行時函數將駐留在內存中?幕後發生了什麼?

Ruby中沒有函數。

這種情況怎麼樣?是遲到還是早綁定?

一切總是遲到。儘管如此,它並沒有像那樣極端的延遲,但是與Java或C♯相比,它肯定是遲到的。

+0

我很困惑。首先你說'它總是早結合',而你寫'一切都是遲到的'。我錯過了什麼嗎? – mhaseeb