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

时间:2013-03-18 11:25:28

标签: ruby class module lookup eigenclass

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

class Module  
  def foo  
    puts "phew"  
  end  
end

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

Class.foo

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

relation between classes and modules

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

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

但现在

Class.bar 

也有效。

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


我想我现在明白了。方法查找不像我之前解释的那样工作。当我做Class.foo时,方法在Class的本征类中搜索,然后是超类,它是Module的本征类,一直到BasicObject的本征类,点它自己(就像蛇吃它自己的尾巴)来寻找Class中的方法(因为ClassBasicObject的本征类的超类),然后是它的超类{ {1}},找到方法。

类似地,当我Module时,方法在Class.bar的本征类中搜索,然后在Class的本征类中搜索它。

当我这样做时

Module

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

这是我目前的理解: current understanding

3 个答案:

答案 0 :(得分:1)

this blog post by Andrea Singh涉及Eigenclasses时,Ruby的方法查找行为有一个相当全面的概述。值得注意的是,最末端附近的“Eigenclasses和Class Inheritance”部分包含一个有用的查找图,可以解决您的问题。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我最近在Ruby中编写了有关$startTime = new \DateTime('2017-12-12 20:00:00'); $rule = new \Scheduler\Job\RRule('FREQ=MONTHLY;COUNT=5', $startTime); //run monthly, at 20:00:00 starting from the 12th of December 2017, 5 times $job = new \Scheduler\Job\Job($rule, function () { //do something });的教程:

Understanding the eigenclass in less than 5 minutes