ما هو mattr_accessor في القضبان الوحدة ؟
-
06-07-2019 - |
سؤال
أنا حقا لا يمكن العثور على هذا في القضبان الوثائق ولكن يبدو أن 'mattr_accessor' هو وحدة نتيجة ل 'attr_accessor' (جالبة & واضع) في العادي روبي الدرجة.
على سبيل المثال.في فئة
class User
attr_accessor :name
def set_fullname
@name = "#{self.first_name} #{self.last_name}"
end
end
على سبيل المثال.في وحدة نمطية
module Authentication
mattr_accessor :current_user
def login
@current_user = session[:user_id] || nil
end
end
هذا المساعد الطريقة يتم توفيرها من قبل ActiveSupport.
المحلول
القضبان يمتد روبي مع كل mattr_accessor
(وحدة ثانوي) ، cattr_accessor
(وكذلك _reader
/_writer
الإصدارات).كما روبي attr_accessor
يولد جالبة/واضع طرق الحالات, cattr/mattr_accessor
توفر جالبة/أساليب اضع في الدرجة أو وحدة المستوى.وبالتالي:
module Config
mattr_accessor :hostname
mattr_accessor :admin_email
end
هو باختصار:
module Config
def self.hostname
@hostname
end
def self.hostname=(hostname)
@hostname = hostname
end
def self.admin_email
@admin_email
end
def self.admin_email=(admin_email)
@admin_email = admin_email
end
end
كلا الإصدارين تسمح لك للوصول إلى مستوى الوحدة النمطية المتغيرات مثل ذلك:
>> Config.hostname = "example.com"
>> Config.admin_email = "admin@example.com"
>> Config.hostname # => "example.com"
>> Config.admin_email # => "admin@example.com"
نصائح أخرى
و
كما يمكنك أن ترى, أنهم متطابقة الى حد كبير.
لماذا هناك اثنين من مختلف الإصدارات ؟ في بعض الأحيان كنت تريد أن تكتب cattr_accessor
في وحدة نمطية, لذلك يمكنك استخدامه للحصول على معلومات التكوين مثل أفدي يذكر.
ومع ذلك ، cattr_accessor
لا يعمل في وحدة ، حتى أنها أكثر أو أقل نسخ التعليمات البرمجية عبر للعمل وحدات أيضا.
بالإضافة إلى ذلك, في بعض الأحيان قد ترغب في كتابة فئة الأسلوب في الوحدة ، بحيث كلما أي فئة تشمل الوحدة ، فإنه يحصل على هذه الدرجة الأسلوب وكذلك جميع أساليب المثال. mattr_accessor
كما يتيح لك القيام بذلك.
ومع ذلك ، في السيناريو الثاني هو السلوك هو غريب جدا.نلاحظ البرمجية التالية بصورة خاصة @@mattr_in_module
بت
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"