有人可以给出一个清楚的例子,在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不会抱怨。它只会在运行时失败(如果你要传递一些参数,那就是) –