2015-12-11 51 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