有人可以給出一個清楚的例子,在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|
----------
希望我幫你:)
我認爲這是所有後期綁定。當然沒有像C#一樣。 –
檢查我的更新爲我正在談論的場景 – mhaseeb
'Foo'可能甚至沒有參數化的構造函數,並且在加載此代碼時ruby不會抱怨。它只會在運行時失敗(如果你要傳遞一些參數,那就是) –