Ruby method_missing 在 class 和模块中的用法

Ruby method_missing usage in class and module

如何在class和混合模块中使用method_missing

module Bar
  def method_missing(name, *args)
    p 'Bar' if name =~ /bar/
  end
end

class Foo
  include Bar

  def method_missing(name, *args)
    p 'Foo' if name =~ /foo/
  end
end

a = Foo.new
a.foofoo => "Foo"
a.barbar => nil

使用super:

module Bar
  def method_missing(name, *args)
    p 'Bar' if name =~ /bar/
  end
end

class Foo
  include Bar

  def method_missing(name, *args)
    p 'Foo' if name =~ /foo/
    super # ⇐ HERE
  end
end

a = Foo.new
a.foofoo => "Foo"
a.barbar => "Bar"

正如@ndn 在评论中指出的那样,人们可能会谨慎处理不同的结果。当且仅当 Foo#method_missing 实施没有成功时,super 才可以使用:

  def method_missing(name, *args)
    case name
    when /foo/ then p 'Foo'
    # .....
    else super # ⇐ HERE
    end
  end