Yanıtlar:
Yazma @age
, örnek değişkenine doğrudan erişir @age
. Yazma self.age
, nesneye age
, genellikle örnek değişkeni döndürecek olan iletiyi göndermesini söyler @age
- ancak age
yöntemin belirli bir alt sınıfta nasıl uygulandığına bağlı olarak çok sayıda başka şey yapabilir . Örneğin, her zaman olduğundan 10 yaş daha küçük olduğunu bildiren bir MiddleAgedSocialite sınıfınız olabilir. Ya da daha pratik olarak, bir PersistentPerson sınıfı, kalıcı bir mağazadan bu verileri tembel olarak okuyabilir, tüm kalıcı verilerini bir karma içinde önbelleğe alabilir.
Fark, yöntemin kullanımını, uygulanmasından ayırmasıdır. Mülkün uygulaması değişecek olsaydı - doğum tarihini tutmayı ve sonra şimdi ve doğum tarihi arasındaki zaman farkına göre yaşı hesaplamayı - varsa, yönteme bağlı olan kodun değişmesine gerek yoktur. Özelliği doğrudan kullandıysa, değişikliğin kodun diğer alanlarına yayılması gerekir. Bu anlamda, özelliği doğrudan kullanmak, sınıf tarafından sağlanan arabirimi kullanmaktan daha kırılgandır.
Struct.new
Bir intializer oluşturmanın temiz bir yolu olan bir sınıfı devraldığınızda uyarılırsınız ( Ruby'de başlatıcı nasıl oluşturulur? )
class Node < Struct.new(:value)
def initialize(value)
@value = value
end
def show()
p @value
p self.value # or `p value`
end
end
n = Node.new(30)
n.show()
dönecek
30
nil
Ancak, başlatıcıyı çıkardığınızda,
nil
30
Sınıf tanımı ile
class Node2
attr_accessor :value
def initialize(value)
@value = value
end
def show()
p @value
p self.value
end
end
Yapıcıyı sağlamalısınız.
n2 = Node2.new(30)
n2.show()
dönecek
30
30
İlk cevap tamamen doğrudur, ancak göreceli bir acemi olarak ne ima ettiğini hemen anlayamadım (kendime mesaj göndermek? Uh huh ...). Kısa bir örneğin yardımcı olacağını düşünüyorum:
class CrazyAccessors
def bar=(val)
@bar = val - 20 # sets @bar to (input - 20)
end
def bar
@bar
end
def baz=(value)
self.bar = value # goes through `bar=` method, so @bar = (50 - 20)
end
def quux=(value)
@bar = value # sets @bar directly to 50
end
end
obj = CrazyAccessors.new
obj.baz = 50
obj.bar # => 30
obj.quux = 50
obj.bar # => 50
Hiçbir fark yok. Sadece görmenin self.age
ve other_person.age
birbirine yakın olmanın belgesel değeri için yapıldığından şüpheleniyorum .
Bu kullanımın gerçek bir alıcının gelecekte yazılmasına izin verdiğini varsayalım, bu sadece bir örnek değişkeni döndürmekten daha karmaşık bir şey yapabilir ve bu durumda yöntemin değişmesi gerekmez.
Ancak bu, endişelenmesi olası bir soyutlamadır, sonuçta, eğer nesnenin uygulanması değiştiyse, diğer yöntemleri değiştirmek mantıklıdır, bir noktada nesnenin içindeki basit bir referans mükemmel bir şekilde makul.
Her halükarda, age
mülkün soyutlanması hala açık kullanımını açıklamamaktadır self
, çünkü sadece düz age
de erişimciyi çağırırdı.
@age - kesinlikle örnek değişken yaştır
self.age - örnek özellik yaşını belirtir.