类,模块,它们的本征类和方法查找

ora*_*nge 5 ruby lookup module class eigenclass

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

class Module  
  def foo  
    puts "phew"  
  end  
end
Run Code Online (Sandbox Code Playgroud)

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

Class.foo
Run Code Online (Sandbox Code Playgroud)

这是可以理解的,因为ClassClass超类的类Module.所以它可以调用中定义的实例方法Module.

类和模块之间的关系

现在,bar下面的方法是在Module'eigenclass 上定义的:

class Module  
   def self.bar  
     puts "bar"  
   end  
end
Run Code Online (Sandbox Code Playgroud)

但现在

Class.bar 
Run Code Online (Sandbox Code Playgroud)

也有效.

有人可以解释一下如何在特征类Class中访问方法Module吗?


我想我现在明白了.方法查找不像我之前解释的那样工作.当我这样做的时候Class.foo,这个方法是在特征Class类中进行搜索,然后是超类,它是本Module征类的特征类,直到它的特征类BasicObject,此时它会转向自身(就像蛇吃它自己的尾巴)来寻找方法Class(就像'eigenclass Class的超类BasicObject一样)然后到它的超类Module,它找到了方法.

类似地,当我这样做时Class.bar,方法在Class's eigenclass中搜索,然后在Module它找到它的本征类中搜索.

当我做

class Class   
  def check  
    puts "class instance method"  
  end
end   
Run Code Online (Sandbox Code Playgroud)

class Module   
  def self.check    
    puts "modules eigenclass method"     
  end    
  def check    
    puts "module instance method"   
  end     
end
Run Code Online (Sandbox Code Playgroud)

当我做的时候猜猜是输出:

Class.check 
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*une 0

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

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