让我们打开课程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
的本征类的超类),然后是它的超类{ {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
这是我目前的理解:
答案 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
});
的教程: