5

让我们打开类Module并为其添加一个方法:

class Module  
  def foo  
    puts "phew"  
  end  
end

我可以通过这样做来调用这个方法,

Class.foo

这是可以理解的,因为 class of Classis Class,其超类 is Module。所以它可以调用定义在Module.

类和模块之间的关系

现在,bar下面的方法是在 的特征类上定义Module的:

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

但现在

Class.bar 

也有效。

有人可以解释一下如何Class访问Moduleeigenclass 中的方法吗?


我想我现在明白了。方法查找不像我之前解释的那样工作。当我这样做时Class.foo,该方法在Class的 eigenclass 中搜索,然后它是超类,它是Moduleeigenclass 一直到BasicObject的 eigenclass,此时它会转向自身(就像一条蛇吃自己的尾巴)以在Class(的eigenclass)Class的超类也是BasicObject如此,然后是它的 superclass Module,它在那里找到方法。

同样,当我这样做时Class.bar,方法会在 ' 的 eigenclass 中搜索Class,然后在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 

这是我目前的理解: 目前的理解

4

3 回答 3

1

当Andrea Singh的这篇博文中涉及 Eigenclasses 时,对 Ruby 的方法查找行为进行了相当全面的概述。值得注意的是,接近最后的“特征类和类继承”部分包含一个有用的查找图,可以解决您的问题。

于 2013-04-13T19:39:54.303 回答
0

我最近写了一个相当广泛的教程,包括新的 Ruby 2.0 行为。

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

于 2013-04-13T19:44:15.853 回答
0

我最近写了一篇关于eigenclassRuby 的教程:

在不到 5 分钟的时间内了解特征类

于 2019-01-16T10:16:18.507 回答