概要
Object#send(name, *args) -> object
Object#send(name, *args) { .... } -> object
Object#__send__(name, *args) -> object
Object#__send__(name, *args) { .... } -> object
詳細
オブジェクトのメソッド name を args を引数に して呼び出し、メソッドの実行結果を返却。
send が再定義された場合に備えてライブラリでは __send__ を利用するべき。
send , __send__ は private / protected / public の可視性を無視する。
サンプルコード
require 'tbpgr_utils' class Hoge def public_hoge return "public_hoge" unless block_given? yield end protected def protected_hoge return "protected_hoge" unless block_given? yield end private def private_hoge return "private_hoge" unless block_given? yield end end hoge = Hoge.new bulk_puts_eval binding, <<-EOS hoge.send(:public_hoge) hoge.send(:protected_hoge) hoge.send(:private_hoge) hoge.send(:public_hoge) { |e|p "block public_hoge" } hoge.send(:protected_hoge) { |e|p "block protected_hoge" } hoge.send(:private_hoge) { |e|p "block private_hoge" } hoge.__send__(:public_hoge) hoge.__send__(:protected_hoge) hoge.__send__(:private_hoge) hoge.__send__(:public_hoge) { |e|p "block public_hoge" } hoge.__send__(:protected_hoge) { |e|p "block protected_hoge" } hoge.__send__(:private_hoge) { |e|p "block private_hoge" } EOS __END__ 下記はTbpgrUtils gemの機能 bulk_puts_eval https://rubygems.org/gems/tbpgr_utils https://github.com/tbpgr/tbpgr_utils
出力
"block public_hoge" "block protected_hoge" "block private_hoge" "block public_hoge" "block protected_hoge" "block private_hoge" hoge.send(:public_hoge) # => "public_hoge" hoge.send(:protected_hoge) # => "protected_hoge" hoge.send(:private_hoge) # => "private_hoge" hoge.send(:public_hoge) { |e|p "block public_hoge" } # => "block public_hoge" hoge.send(:protected_hoge) { |e|p "block protected_hoge" } # => "block protected_hoge" hoge.send(:private_hoge) { |e|p "block private_hoge" } # => "block private_hoge" hoge.__send__(:public_hoge) # => "public_hoge" hoge.__send__(:protected_hoge) # => "protected_hoge" hoge.__send__(:private_hoge) # => "private_hoge" hoge.__send__(:public_hoge) { |e|p "block public_hoge" } # => "block public_hoge" hoge.__send__(:protected_hoge) { |e|p "block protected_hoge" } # => "block protected_hoge" hoge.__send__(:private_hoge) { |e|p "block private_hoge" } # => "block private_hoge"