Ruby中的后期和早期绑定

时间:2015-12-11 08:16:20

标签: ruby

有人能给出一个明确的例子,说明Ruby中出现lateearly binding的情况吗?红宝石一般是晚期结合还是早期结合?在Ruby中的对象上调用函数时会发生什么?它是否已经知道运行时方法在内存中的位置?幕后发生了什么?

在C#等语言中,除非使用Reflection API,否则它始终是早期绑定。在Java中,后期绑定正常发生。

已更新

这个案子怎么样?它是晚绑定还是早期绑定?

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

2 个答案:

答案 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中没有任何功能。

  

这个案子怎么样?它是晚绑定还是早期绑定?

一切都是迟到的。

虽然它不像那么晚,但与Java或C♯相比,它肯定是后期限制的。