Sendでオブジェクトのプロパティに代入

オブジェクトのプロパティを send メソッドで参照するには、send の引数にプロパティの名前を渡せばいい。

たとえば、以下のようなUserクラスがあったときに send で nameをひっぱって来るには以下のようにする。

class User
  attr_accessor :name, :email
  def initialize(name, email)
    @name = name
    @email = email
  end
end

>> user = User.new('chu', '[email protected]')
=> #
>> user.name
=> "chu"
>> user.send('name')
=> "chu"

設定ファイルでフィールド決めて内部で処理するようなときはよく使う。

次に、send を使ってオブジェクトのプロパティに 値を設定したい場合は、 send に引数を二つ渡す。 ruby は プロパティへのアクセスも全てメソッドになってる。

name属性への代入は、 name= というメソッドに引数を渡していることになる。

user = User.new(‘chu’, ‘[email protected]’)
=> #
user.send(‘name=’, ‘chu2’)
=> “chu2”
user.name
=> “chu2”

send について調べてみたら、以下のようになっていた。第一引数にメソッド名を渡して、そのメソッドに対する引数は可変長の第二引数以降に渡せばいいみたい。

send(name[, args … ])
send(name[, args … ]) { …. }
__send__(name[, args … ])
__send__(name[, args … ]) { … }

オブジェクトのメソッド name を、引数に args を渡して呼び出し、メソッドの実行結果を返します。
ブロック付きで呼ばれたときはブロックもそのまま引き渡します。メソッド名 name は文字列かSymbol です。
send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。
send, __send__ は、呼び出し制限 にかかわらず任意のメソッドを呼び出せます。
ruby 1.9 feature: 呼び出し制限がsend, __send__にも影響するようになり、レシーバを指定した呼び出しではprivateメソッドを呼び出せなくなりました。 privateメソッドを呼び出す必要がある場合はinstance_evalを使用してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です