2012-11-04 29 views
24

'u ne yapar? Başımı, başlangıç ​​yöntemini kullanmak amacıyla sarmaya çalışıyorum. Hartl en öğretici yılındaRaylarda başlatma yöntemi,

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

biz argüman attributes = {} var neden özelliklerine örnek değişkenleri @name ve @email ayarı başlatmak ve eğer öyleyse mı .. örnek kullanır?

cevap

32

Ruby bir nesnenin yapıcı olarak initialize yöntemini kullanır. Rails çerçevesine özgü olmayan Ruby dilinin bir parçasıdır. Bir Class üzerinde new sınıf düzeyinde yöntemi çağırma

@person = Person.new 

bu sınıfın bir tür ayırır, sonra da nesnenin initialize yöntemini çağırır:

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

aşağıdaki gibi yeni bir nesne instanstiate zaman çağrılır

Tüm nesneler herhangi bir parametre kabul eden bir varsayılan initialize yöntemine sahip (eğer yazmaya gerek yoktur - sen automagicallylar olsun). Nesnenin initialize yönteminde farklı bir şey yapmasını istiyorsanız, kendi sürümünüzü tanımlamanız gerekir.

Örneğinizde, @name ve @email varsayılan değerlerini ayarlamak için kullanılabilecek initialize yöntemine bir karma aktarıyorsunuz.

kullanabilirsiniz bu gibi:

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

başlatıcı özellikleri için varsayılan bir değer (attributes = {} bir ampty karma varsayılan değerini ayarlar - {}) sahiptir sebebi de kalmadan diyoruz ki böyledir argüman geçmek. Bir argüman belirtmezseniz, o zaman attributes boş bir karma olacaktır ve bu nedenle @name ve @email her ikisi de nil değerleri olacaktır (:name ve :email).

+3

Birkaç nokta daha: 'initialize' işlevini kullanma mekanizması aslında bir Ruby değil bir Rails biridir. Öznitelikler için varsayılan değer olarak boş bir kareyi geçirme ('attributes = {}'), hash 'öznitelikleri [: name] # nil'de ayarlanmamış bir anahtara erişmeye çalışırken nilgolsüz olarak dönecektir - varsayılan değer yoksa ("initialize (attributes)" gibi bir yönteme ait özniteliğe erişme "attributes [: something] # error" gibi bir hata atacaktır. – tamersalama

+0

İyi bir nokta - Ruby'nin bir parçası olduğunu ve Ruby belgelerine bağlı olduğunu açıklığa kavuşturmak için düzenlenmiştir. 'new' yöntemini ve' initialize'i nasıl çağırdığını açıklar. –

+0

Michael ve tamersalama, bilgi için teşekkürler.Ancak şimdi başlatmayı anlıyorum.Online – jason328