2009-06-10 13 views
17

以下のRubyコードを理解しようとしています。initialize()のハッシュ引数でself.sendを繰り返し呼び出す

attrsは、空のハッシュの既定値で引数として渡されるハッシュです。

次に、attrs.eachは、ハッシュ(|k,v|)のキーと値のペアを反復処理します。

この反復中にキー値のペアの要素に対してself.sendを呼び出すと、どのような効果が得られますか?

def initialize(attrs = {}, *args) 
    super(*args) 
    attrs.each do |k,v| 
    self.send "#{k}=", v 
    end 
end 
+0

1に相当します

self.send "name=", "John Smith" 

オブジェクトの作成/初期化。私の答え@ http://stackoverflow.com/questions/1778638/idiomatic-object-creation-in-ruby/5272354#5272354 – abe

答えて

21

sendは、最初のパラメータでメソッドを呼び出し、残りのパラメータを引数として渡します。

この場合、私はattrsにあるものを属性リストと仮定します。のは、それがこのようなものだとしましょう:

{ :name => "John Smith" } 

それではループで、それはこのない:私は柔軟性のために、このコードを使用して大好きです

self.name = "John Smith" 
+0

を参照してください。ありがとう。つまり、あなたの例題の名前がクラスメソッドになるということです。 – franz

+2

まず最初に、この例ではメソッドをまったく作成していません。すでに存在していなければならない 'name ='メソッドを呼び出しています。第2に、インスタンスメソッド内の自己(初期化など)はそのインスタンスを参照します。これはインスタンスメソッドを呼び出しています。 – Chuck

+0

'name ='メソッドは 'attr_accessor:name'ヘルパーによって自動的に作成されることに言及する価値があります。 –

関連する問題