İşte kaynağı cattr_accessor
Ve
İşte kaynağı mattr_accessor
Gördüğünüz gibi hemen hemen aynılar.
Neden iki farklı versiyon olduğuna gelince? Bazen cattr_accessor
bir modülde yazmak istersiniz , böylece Avdi'nin bahsettiği gibi yapılandırma bilgileri için kullanabilirsiniz .
Ancak, cattr_accessor
bir modülde çalışmaz, bu nedenle modüller için de çalışmak üzere kodu aşağı yukarı kopyaladılar.
Ek olarak, bazen bir modülde bir sınıf yöntemi yazmak isteyebilirsiniz, öyle ki herhangi bir sınıf modülü içerdiğinde, o sınıf yönteminin yanı sıra tüm örnek yöntemlerini de alır. mattr_accessor
ayrıca bunu yapmanıza izin verir.
Bununla birlikte, ikinci senaryoda, davranışı oldukça tuhaftır. Aşağıdaki kodu inceleyin, özellikle @@mattr_in_module
bitlere dikkat edin
module MyModule
mattr_accessor :mattr_in_module
end
class MyClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # directly access the class variable
end
MyModule.mattr_in_module = 'foo' # set it on the module
=> "foo"
MyClass.get_mattr # get it out of the class
=> "foo"
class SecondClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # again directly access the class variable in a different class
end
SecondClass.get_mattr # get it out of the OTHER class
=> "foo"
mattr_accessor
sınıf örneği değişkenlerinin kısa olacağını açıklıyorsunuz@variable
, ancak kaynak kodu aslında sınıf değişkenlerini ayarladıklarını / okuduklarını gösteriyor gibi görünüyor. Bu farkı açıklar mısınız lütfen?