2012-11-04 20 views
24

Próbuję zawinąć głowę wokół celu użycia metody initialize. W tutorialu Hartl za, wykorzystuje on przykładem ..Co robi metoda inicjowania w szynach do

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

Czy zainicjować ustawienie zmiennych instancji @name i @email do atrybutów, a jeśli tak, to dlaczego mamy argument attributes = {}?

Odpowiedz

32

Ruby używa metody initialize jako konstruktora obiektu. Jest to część języka Ruby, nie specyficznego dla środowiska Rails. Jest on wywoływany kiedy instanstiate nowego obiektu, takich jak:

@person = Person.new 

Wywołanie metody poziomu new klasy na Class przydziela typ tej klasy, a następnie wywołuje obiektu initialize metody:

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

Wszystkie obiekty mają domyślną metodę initialize, która nie przyjmuje żadnych parametrów (nie trzeba jej pisać - otrzymuje się ją automagicznie). Jeśli chcesz, aby Twój obiekt robił coś innego w metodzie initialize, musisz zdefiniować jego własną wersję.

W twoim przykładzie przekazujesz skrót do metody initialize, która może być użyta do ustawienia domyślnej wartości @name i @email.

tego użyć takich jak:

@person = Person.new({name: 'John Appleseed', email: '[email protected]'}) 

Powodem inicjator ma wartość domyślną dla atrybutów (attributes = {} ustawia wartość domyślną do hash ampty - {}) jest tak, że można również nazwać bez konieczności przekazać argument. Jeśli nie podasz argumentu, to attributes będzie pustym hashem, a zatem zarówno wartości @name jak i @email będą wartościami nie kluczowymi dla tych kluczy (:name i :email).

+3

Para więcej punktów: mechanizm używania 'initialize' jest w rzeczywistości Rubinem, a nie Railsiem. Przekazywanie pustego skrótu jako wartości domyślnej dla atrybutów ('attributes = {}') zwróci zero podczas próby uzyskania dostępu do klucza, który nie został ustawiony w hash 'attributes [: name] # nil' - jeśli nie ma wartości domyślnej został ustawiony (jak 'initialize (attributes)' dostęp do atrybutu w metodzie spowoduje zgłoszenie błędu 'attributes [: something] # error'. – tamersalama

+0

Dobry punkt - zredagowany w celu wyjaśnienia, że ​​jest częścią Ruby i połączony z dokumentami Ruby które wyjaśniają "nową" metodę i sposób, w jaki się ją inicjalizuje, –

+0

Michael i tamersalama, dziękuję za informację. Rozumiem, że teraz zainicjuj teraz: – jason328