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_accessordalam modul, sehingga Anda dapat menggunakannya untuk info konfigurasi seperti yang disebutkan Avdi .
Namun, cattr_accessortidak 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_accessorjuga memungkinkan Anda melakukan ini.
Namun, dalam skenario kedua, perilakunya cukup aneh. Perhatikan kode berikut, terutama perhatikan @@mattr_in_modulebit - 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_accessorakan menjadi kependekan dari variabel instance kelas@variable, tetapi kode sumber tampaknya mengungkapkan bahwa mereka sebenarnya menyetel / membaca variabel kelas. Bisakah Anda menjelaskan perbedaan ini?