Saya tidak dapat benar-benar menemukan ini dalam dokumentasi Rails tetapi sepertinya 'mattr_accessor' adalah wajar Modul untuk 'attr_accessor' (getter & setter) di kelas Ruby normal .
Misalnya. di kelas
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
Misalnya. dalam sebuah modul
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
Metode pembantu ini disediakan oleh ActiveSupport .
ruby-on-rails
ruby
class
module
activesupport
JasonOng
sumber
sumber
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?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 - bitnyasumber
cattr_*
sekarang alias untukmattr_*
. Lihatcattr_accessor
sumbernya