Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Object | respond_to?

概要

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