概要
Object#respond_to?(name, include_all = false) -> bool
詳細
オブジェクトがメソッド name を持つとき真を返却
NotImplementedError が発生する場合は真を返却
NotImplementedError の場合に偽を返すようになった経緯については下記を参照。
http://comments.gmane.org/gmane.comp.lang.ruby.devel/12261
ただし、 NotImplementedError が偽を返すのはあくまでネイティブなメソッドのみなのか??
公式にあるように、Linuxで File.lchmod に対して試した場合は確かに偽を返すのですが、
自作したメソッドで NotImplementedError を投げるコードを書いてみましたが,
respond_to? は真を返しました。
サンプルコード
require 'tbpgr_utils' class Template def main start private_start template_method finish end def start puts "start" end def template_method raise NotImplementedError, "hoge" end def finish puts "finish" end private def private_start puts "private_start_start" end end class Hoge include Template end class Hige include Template def template_method "template_method" end end hoge = Hoge.new hige = Hige.new bulk_puts_eval binding, <<-EOS hoge.respond_to?(:start) hoge.respond_to?(:start, true) hoge.respond_to?(:private_start) hoge.respond_to?(:private_start, true) hoge.respond_to?(:template_method) hoge.respond_to?(:template_method, true) hige.respond_to?(:start) hige.respond_to?(:start, true) hige.respond_to?(:private_start) hige.respond_to?(:private_start, true) hige.respond_to?(:template_method) hige.respond_to?(:template_method, true) File.respond_to?(:lchmod) EOS __END__ 下記はTbpgrUtils gemの機能 bulk_puts_eval https://rubygems.org/gems/tbpgr_utils https://github.com/tbpgr/tbpgr_utils
出力
$ ruby object_respond.rb hoge.respond_to?(:start) # => true hoge.respond_to?(:start, true) # => true hoge.respond_to?(:private_start) # => false hoge.respond_to?(:private_start, true) # => true hoge.respond_to?(:template_method) # => true hoge.respond_to?(:template_method, true) # => true hige.respond_to?(:start) # => true hige.respond_to?(:start, true) # => true hige.respond_to?(:private_start) # => false hige.respond_to?(:private_start, true) # => true hige.respond_to?(:template_method) # => true hige.respond_to?(:template_method, true) # => true File.respond_to?(:lchmod) # => false