একটি রেল মডিউলে mattr_accessor কী?


107

আমি সত্যই এটি রিল ডকুমেন্টেশনে খুঁজে পাইনি তবে মনে হচ্ছে 'ম্যাটার_একসেসর' হ'ল একটি সাধারণ রুবি শ্রেণিতে 'অ্যাটার_একসেসর' ( গেটর এবং সেটর) এর মডিউল করলারি

যেমন। একটি ক্লাসে

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

এই সহায়ক পদ্ধতিটি অ্যাক্টিভসপোর্ট দ্বারা সরবরাহ করা হয়েছে

উত্তর:


181

রেলগুলি উভয় 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"

1
আপনার উদাহরণগুলিতে, আপনি ব্যাখ্যা করেছেন যে mattr_accessorশ্রেণি উদাহরণের ভেরিয়েবল ( @variableগুলি) এর জন্য সংক্ষিপ্ত হবে , তবে উত্স কোডটি প্রকাশিত বলে মনে হচ্ছে যে তারা প্রকৃতপক্ষে শ্রেণীর ভেরিয়েবলগুলি সেট / পাঠ করছে। আপনি কি এই পার্থক্যটি ব্যাখ্যা করতে পারেন?
Sandre89

38

এর উত্স এখানে 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"

ডিফল্ট_ইউর_অ্যাপশনগুলি সরাসরি (একটি ম্যাটার_অ্যাকসেসর) সেট করার সময় এটি আমার পক্ষে খুব কঠিন ছিল। শ্রেণি একবার তাদের এক উপায়ে সেট করে এবং অন্যটি তাদের আলাদাভাবে সেট করে দেয়, ফলে অবৈধ লিঙ্ক তৈরি হয়।
এরিক ডেভিস

রেলের সর্বশেষতম সংস্করণে cattr_*এখন এর জন্য অন্যান্য নাম mattr_*cattr_accessorউত্সটি
জুলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.