有人能给出一个明确的例子,说明Ruby中出现late
和early binding
的情况吗?红宝石一般是晚期结合还是早期结合?在Ruby中的对象上调用函数时会发生什么?它是否已经知道运行时方法在内存中的位置?幕后发生了什么?
在C#等语言中,除非使用Reflection API
,否则它始终是早期绑定。在Java中,后期绑定正常发生。
已更新
这个案子怎么样?它是晚绑定还是早期绑定?
def create_something(klass, *args)
klass.new(*args)
end
my_foo = create_something(Foo)
答案 0 :(得分: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都会执行所谓的方法查找。
在Ruby中的对象上调用函数时会发生什么?幕后发生了什么?
方法查找是一个过程,其中Ruby直接进入接收器的类,然后是祖先链,直到它找到方法或到达链的末尾。为了说明这一点:
BasicObject
^
|
...
^
|
----------
| A |
----------
|a_method|
----------
^
|
----------
| B |
obj -------> ----------
|b_method|
----------
希望我帮助过你:)
答案 1 :(得分:0)
有人能给出一个明确的例子,说明在Ruby中发生晚期和早期绑定的情况吗?
红宝石一般是晚期结合还是早期结合?
它总是迟到。
在Ruby中的对象上调用函数时会发生什么?它是否已经知道运行时函数将驻留在内存中的哪个位置?幕后发生了什么?
Ruby中没有任何功能。
这个案子怎么样?它是晚绑定还是早期绑定?
一切都是迟到的。
虽然它不像selflanguage或newspeak那么晚,但与Java或C♯相比,它肯定是后期限制的。