سؤال

أنا حقا لا يمكن العثور على هذا في القضبان الوثائق ولكن يبدو أن '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

و

هنا المصدر mattr_accessor

كما يمكنك أن ترى, أنهم متطابقة الى حد كبير.

لماذا هناك اثنين من مختلف الإصدارات ؟ في بعض الأحيان كنت تريد أن تكتب 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"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top