新手问题 如何将实例方法变成类方法?

qwaszx102938 · 2014年12月13日 · 最后由 qwaszx102938 回复于 2014年12月13日 · 2314 次阅读

小弟新学 ruby,有个疑问。继承自 ActionMailer 的 子类定义的实例方法为什么可以像类方法一样调用呢?各位大大能否解答一下,最好能举一个例子。谢谢了!!!

既然知道类,为什么不直接用实例或者直接定义成类方法呢?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 😄

2 楼的也是正解。 刚刚打开 ActionMailer 的源码看了,我自己也来回答一下吧。其实首先是在类作用域中利用了 methods_missing 这个幽灵方法,在 methods_missing new 了一次对象,再通过 new 的对象调用实例方法。 再次,发现 ActionMailer 跟 controller 的原理是一样的,不让我们自行管理类的实例化,只能通过类方法的方式调用,但其实这不是一个类方法。

最后感叹一句,ruby 太神奇了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号