Ini sumbernya cattr_accessor
Dan
Ini sumbernya mattr_accessor
Seperti yang Anda lihat, mereka sangat identik.
Mengapa ada dua versi berbeda? Terkadang Anda ingin menulis cattr_accessor
dalam modul, sehingga Anda dapat menggunakannya untuk info konfigurasi seperti yang disebutkan Avdi .
Namun, cattr_accessor
tidak berfungsi dalam modul, jadi mereka lebih atau kurang menyalin kode untuk bekerja untuk modul juga.
Selain itu, terkadang Anda mungkin ingin menulis metode kelas dalam modul, sehingga setiap kali kelas menyertakan modul, ia mendapatkan metode kelas tersebut serta semua metode instance. mattr_accessor
juga memungkinkan Anda melakukan ini.
Namun, dalam skenario kedua, perilakunya cukup aneh. Perhatikan kode berikut, terutama perhatikan @@mattr_in_module
bit - bitnya
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
akan menjadi kependekan dari variabel instance kelas@variable
, tetapi kode sumber tampaknya mengungkapkan bahwa mereka sebenarnya menyetel / membaca variabel kelas. Bisakah Anda menjelaskan perbedaan ini?