小弟新学 ruby,有个疑问。继承自 ActionMailer 的 子类定义的实例方法为什么可以像类方法一样调用呢?各位大大能否解答一下,最好能举一个例子。谢谢了!!!
既然知道类,为什么不直接用实例或者直接定义成类方法呢?klass.new.foo
klass.new.foo
class C def bar; 'instance bar' end def baz; 'instance baz' end end class C def self.become_evil(*names) obj = new names.each{|name| define_singleton_method(name, &obj.method(name.to_sym))} end become_evil :baz, :bar end C.bar C.baz
或者 extend self
extend self
2 楼的也是正解。 刚刚打开 ActionMailer 的源码看了,我自己也来回答一下吧。其实首先是在类作用域中利用了 methods_missing 这个幽灵方法,在 methods_missing new 了一次对象,再通过 new 的对象调用实例方法。 再次,发现 ActionMailer 跟 controller 的原理是一样的,不让我们自行管理类的实例化,只能通过类方法的方式调用,但其实这不是一个类方法。
最后感叹一句,ruby 太神奇了。