2010-05-01 6 views
5

Ruby'deki bir kitap üzerinde çalışıyorum ve yazar, kitabın önceki bölümlerinde olduğundan daha fazla bir sınıf başlatma tanımlaması yazmak için biraz farklı bir form kullandı.Bu İki Ruby Sınıfı Başlatma Tanımları Arasındaki Fark Nedir?

Kitabın önceki bölümlerinde
class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    self.venue = venue 
    self.date = date 
    end 
end 

, böyle tanımlanmıştır olurdu: setter yöntemini kullanarak arasında herhangi bir işlevsel fark ilk olarak,

class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    @venue = venue 
    @date = date 
    end 
end 

var mı Şuna benzer örnek, örnek değişkeni ikinci olarak kullanmak gibi mi? İkisi de işe yarıyor gibi görünüyor. Hatta işler karışmadan:

ayarlayıcı yöntem attr_accessor tarafından tanımlanan ve böylece değişken ayarı ama hiçbir şey yapmaz beri
class Ticket 
    attr_accessor :venue, :date 
    def initialize(venue, date) 
    @venue = venue 
    self.date = date 
    end 
end 
+0

+1. –

cevap

9

, ayarlayıcı yöntemi kullanılarak ve doğrudan değişkeni ayarı arasında hiçbir fark yoktur.

Setter yöntemini kullanmanın yalnızca üst tarafı, setter yöntemini, değişkeni ayarlamaktan daha fazla bir şey yapmak için değiştirirseniz (girişi doğrulamak veya bir şeyi günlüğe kaydetmek gibi), initialize yönteminizin bu değişikliklerden etkilenmemesidir. onu değiştirmek zorundasın. Tesadüfe göre programlamak için

+0

+1 Değişiklik bildiriminin mümkün olmadığını (ya da zor ve belgelenmemiş) '@ venue' ile, sadece' self.venue' ile buldum. Öznitelik tabanlı ayarlayıcıları gözlemlemek için bir yol biliyorsa, bana bildirin;) –