类、模块、它们的特征类和方法查找

Posted

技术标签:

【中文标题】类、模块、它们的特征类和方法查找【英文标题】:Class, Module, their eigenclasses, and method lookup 【发布时间】:2013-03-06 17:17:44 【问题描述】:

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

class Module  
  def foo  
    puts "phew"  
  end  
end

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

Class.foo

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

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

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

但现在

Class.bar 

也可以。

谁能解释一下Class 如何访问Module 的特征类中的方法?


我想我现在明白了。方法查找不像我之前解释的那样工作。当我执行Class.foo 时,在Class 的特征类中搜索该方法,然后它是Module 的特征类的超类,一直到BasicObject 的特征类,此时它会自行启动(就像蛇吃自己的尾巴)在Class 中寻找方法(因为ClassBasicObject 的特征类的超类),然后到它的超类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

当我这样做时,我猜 wot 是输出:

Class.check 

这是我目前的理解:

【问题讨论】:

我发现有帮助的相关讨论:***.com/questions/13269271/… 【参考方案1】:

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

【讨论】:

这是 Ruby 2.2 的最新版本吗?【参考方案2】:

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

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

【讨论】:

该网址的链接已失效【参考方案3】:

我最近写了一篇关于 Ruby 中eigenclass 的教程:

Understanding the eigenclass in less than 5 minutes

【讨论】:

以上是关于类、模块、它们的特征类和方法查找的主要内容,如果未能解决你的问题,请参考以下文章

类和实例属性的查找顺序 mro查找

为啥模块的单例方法在混合的下游特征类中不可见?

对象独有的功能,动静态方法,面向对象三大特征,名字查找顺序,派生方法...

用于查找 C# 类和方法名称的正则表达式

从 x86-64 可执行文件中查找类和函数名称

类和对象