Hatena::ブログ(Diary)

わからん

2011.05.31

[] method_missing を再定義したときは、respond_to? も再定義する

method_missing を再定義したときは、respond_to? も再定義した方が良いのか検討すべきです。書籍「メタプログラミングRuby」でも指摘されています*1

class Foo

  def initialize(bar_obj)
    @bar_obj = bar_obj
  end

  def method_missing(name)
    if name.to_s =~ /^(aaa|bbb|ccc)$/
      @bar_obj.send("some_#{name}")
    end
  end

  def respond_to?(method)
    @bar_obj.respond_to?("some_#{method}") || super
  end

end


class Bar
  def some_aaa; "a"; end
  def some_bbb; "b"; end
  def some_ccc; "a"; end
end


foo = Foo.new(Bar.new)
foo.bbb                         # => "b"
foo.ddd                         # => nil
foo.respond_to?("aaa")          # => true  #respond_to? をオーバライドしていない場合は false になる
foo.respond_to?("bbb")          # => true  #respond_to? をオーバライドしていない場合は false になる
foo.respond_to?("ddd")          # => false

*1:p92, p237

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

Google