2013-01-14 15 views
5

, biz şöyle yapıcı yöntemini belirleyecek:`# yerine` arasında initialize` :: new` Ruby

class Thing 
    def initialize 
    do_stuff 
    end 
end 

Ancak, aslında bir örneğini yaparken Nesne, sınıfta initialize aramasını ve sınıfta new aramamızı buluyoruz.

Bu durumda, neden bunun yerine ::new tanımlamıyoruz?

class Thing 
    def self.new 
    do_stuff 
    end 
end 

initalize bulmadığı sahneleri beind yapar ::new şey var mı? Bu ikisi birbirinden farklı mı? ::new tanımlanıyor mu? Yoksa sadece def initialize def self.new'dan daha kısa mı (değil)?

Farklılık için iyi bir neden olması gerektiğini düşünüyorum.

+0

http: //blog.sidu."initialize" kelimesini kullanmaktan nefret ettiğim gerçeğini değiştirmeyen/2007/12/rubys-new-as-factory.html –

cevap

10

Yeni, yeni nesne için alan ayırır ve oluşturur. Ardından, ayrılmış belleği kullanarak yeni bir Nesne oluşturmak için Objects initialize yöntemini çağırır. Genellikle, özelleştirmek istediğiniz tek parça gerçek yaratımdır ve Object.new yöntemine arka bellek ayırma işleminden ayrılmanızdan dolayı mutlu olursunuz, böylece bir başlangıç ​​yöntemi yazarsınız. Ne yeni başlık altında yapıyor (C hariç) şuna benzer:

class Object 
    def self.new(*args, &block) 
     object = allocate 
     object.send(:initialize, *args, &block) 
     return object 
    end 
end 

Eğer Object.new çağrı gidince ne aslında olur ise:

1) Bellek 2 tahsis edilir) nesneler başlatma yöntemi denir.

+0

http://www.ruby-forum.com/topic/61666 –

3
  • İbrahim'in noktası üzerinde durmak için, aslında, bu ilişkiyi tersine çevirir. İlkel olarak allocate ve genellikle new'u tanımladıysanız, her zaman allocate'u çağırmak ve nesneyi en baştan döndürmek gibi ortak şeyler yapmak zorunda kalacaksınız. new ve initialize'a sahip olmak kaydıyla, ikincisi ikincisini saracak, böylece sadece sarılmış olanı değil sargıyı tanımlamanız gerekir.
  • new bir sınıf yöntemidir, bu nedenle bunu tanımladığınızda, varsayılan olarak örnek yöntemlere ve örnek değişkenlerine erişemezsiniz ve erişim sağlayıcılara güvenmeniz gerekir. Öte yandan, initialize bir örnek yöntemdir, bu nedenle örnek değişkenleri ve örnek yöntemleri ile çalışmak daha kolay olacaktır. Örnek değişkenlerine erişim sağlamak için
5

@value gibi örnek değişkenlere örneklerden erişilebilir, ancak bir sınıf yönteminden erişilebilir. Bu, özel örnek değişkenlerin örnek kapsam yerine sınıf içerdiği ve dolayısıyla statik yapıcıdan erişilebildiği Java gibi dillerden farklıdır.

class Thing 
    def initialize 
    @value = 42 
    end 
end 

class Thing 
    def self.new 
    # no way to set the value of @value !!!!!!!! 
    end 
end 

Ruby'nin geçmişi ile ilgilenenler için, örnek-özel örnek değişkenleri olan nesne modeli, Smalltalk'a gider. Ve Pharo, new gibi modern Smalltalk diyalektinde aynı kalıbı Object'da uygulayarak self initialize alt sınıflarının örnek değişkenlerini kolayca başlatabilmesi için aynı modeli bulacaksınız.

+0

Benim dünyamda post initialize veya bir şey olarak adlandırılmalıdır :) – rogerdpack