类、模块、它们的特征类和方法查找
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
中寻找方法(因为Class
是BasicObject
的特征类的超类),然后到它的超类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
【讨论】:
以上是关于类、模块、它们的特征类和方法查找的主要内容,如果未能解决你的问题,请参考以下文章