31

initializeこのメソッドを使用する目的に頭を悩ませようとしています。Hartlのチュートリアルでは、次の例を使用しています。

def initialize(attributes = {})
   @name = attributes[:name]
   @email = attributes[:email]
end

initializeインスタンス変数@nameと属性を設定していますか?@emailもしそうなら、なぜ引数があるのattributes = {}ですか?

4

1 に答える 1

41

Rubyは、initializeメソッドをオブジェクトのコンストラクターとして使用します。これはRuby言語の一部であり、Railsフレームワークに固有のものではありません。次のような新しいオブジェクトをインスタンス化すると呼び出されます。

@person = Person.new

newでクラスレベルのメソッドを呼び出すClassと、そのクラスのタイプが割り当てられ、オブジェクトのinitializeメソッドが呼び出されます。

http://www.ruby-doc.org/core-1.9.3/Class.html#method-i-new

すべてのオブジェクトには、initializeパラメーターを受け入れないデフォルトのメソッドがあります(パラメーターを作成する必要はありません。自動的に取得します)。オブジェクトでメソッド内で別のことを実行したい場合はinitialize、独自のバージョンを定義する必要があります。

あなたの例では、とのデフォルト値を設定するために使用できるメソッドにハッシュを渡していinitializeます。@name@email

次のように使用します。

@person = Person.new({name: 'John Appleseed', email: 'john@some.net'})

初期化子が属性のデフォルト値を持っている(attributes = {}デフォルト値を十分なハッシュに設定する- {})理由は、引数を渡さなくても初期化子を呼び出すことができるようにするためです。引数を指定しない場合attributes、は空のハッシュになり、したがって、これらのキー(および)に値が存在しないため、との両方が値@name@emailなります。nil:name:email

于 2012-11-04T07:51:08.053 に答える