2013-03-18 52 views
5

让我们打开类Module,并添加一个方法吧:类,模块,其eigenclasses和方法查找

class Module 
    def foo 
    puts "phew" 
    end 
end 

我可以这样调用这个方法,

Class.foo 

这是可以理解因为Class的等级是Class,其超类是Module。因此它可以调用在Module中定义的实例方法。现在

relation between classes and modules

,下面的方法bar定义上Module的eigenclass:

class Module 
    def self.bar 
    puts "bar" 
    end 
end 

但现在

Class.bar 

也适用。

有人能解释我如何Class可以访问Module的本征类中的方法吗?


我想我现在明白了。以前我解释过的方法查找不起作用。当我做Class.foo时,该方法在的本征类中搜索,然后它是超类,它是Module的本征类一直到BasicObject的本征类,在此时它转向自身(如同吃蛇的尾巴一样的蛇)以查看对于Class中的方法(因为ClassBasicObject的本征类的超类),然后是它的超类Module,在那里它找到了该方法。

类似地,当我做Class.bar,方法中搜索Class的eigenclass然后在Module的eigenclass它发现它。

当我做

class Class 
    def check 
    puts "class instance method" 
    end 
end 

class Module 
    def self.check  
    puts "modules eigenclass method"  
    end  
    def check  
    puts "module instance method" 
    end  
end 

猜测WOT是输出,当我做:

Class.check 

这是我目前的理解: current understanding

+0

相关讨论我发现有帮助:https:// stackoverflow。com/questions/13269271/why-a-modules-singleton-method-is-not-visible-in-downstream-eigenclasses- – 2016-02-17 16:00:59

回答

0

我最近写了一个漂亮的extensive tutorial,包括新的Ruby 2.0行为。

注意:Ruby中使用的术语是singleton_class,而不是eigenclass

+0

该网址的链接已死亡 – 2016-02-17 15:54:12

1

当Eigenclasses参与this blog post by Andrea Singh时,对Ruby的方法查找行为有一个相当全面的概述。值得注意的是,最后的“特征类和类继承”部分包含一个有用的查找图,它应该解决您的问题。

+0

这是目前为止的Ruby 2.2吗? – 2016-02-17 15:56:57