Tbpgr Blog

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

Ruby | Object | send

概要

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"