sanjay - ruby stone




Ruby এ attr_accessor কি? (12)

আমি Ruby attr_accessor বুঝতে একটি কঠিন সময় হচ্ছে। কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে?


কোন কোড ছাড়া সহজ ব্যাখ্যা

উপরের বেশিরভাগ উত্তর কোড ব্যবহার করে। এই ব্যাখ্যাটি একটি উপমা / গল্পের মাধ্যমে কোনও ব্যবহার না করেই এটির উত্তর দেওয়ার চেষ্টা করে:

বাইরে দল অভ্যন্তরীণ সিআইএ গোপন অ্যাক্সেস করতে পারবেন না

  • আসুন একটি সত্যিই গোপন জায়গা কল্পনা করুন: সিআইএ। সিআইএর ভিতরে থাকা সিআইএর মধ্যে কি ঘটছে তা কেউ জানে না। অন্য কথায়, বহিরাগত মানুষ সিআইএর কোন তথ্য অ্যাক্সেস করতে পারে না। কিন্তু এটি কোনও সংস্থার কাছে সম্পূর্ণ গোপনীয় না থাকার কারণে, কিছু তথ্য বাইরের বিশ্বের জন্য উপলব্ধ করা হয় - সিআইএর কেবলমাত্র সবকিছুই অবশ্যই জানতে চায়: যেমন সিআইএর পরিচালক, পরিবেশগতভাবে এই বিভাগটি কিভাবে তুলনা করা যায় অন্যান্য সকল সরকারী বিভাগ ইত্যাদি। অন্যান্য তথ্যঃ যেমন ইরাক বা আফগানিস্তানে তার গোপন কর্মীরা কে - এই ধরনের জিনিস সম্ভবত 150 বছরের জন্য গোপন থাকবে।

  • আপনি যদি সিআইএর বাইরে থাকেন তবে কেবলমাত্র জনসাধারণের কাছে উপলব্ধ তথ্যটি অ্যাক্সেস করতে পারবেন। অথবা সিআইএ নীতিমালা ব্যবহার করার জন্য আপনি শুধুমাত্র "ক্লিয়ার" তথ্য অ্যাক্সেস করতে পারবেন।

  • সিআইএর বাইরে সাধারণ জনগণের কাছে সিআইএ উপলব্ধি করতে চায় এমন তথ্যকে বলা হয়: গুণাবলী।

পড়া এবং লেখার গুণাবলী এর অর্থ:

  • সিআইএ ক্ষেত্রে, সর্বাধিক গুণাবলী "শুধুমাত্র পড়া" হয়। এর মানে হল আপনি যদি সিআইএর বাহিরে একটি দল হন তবে আপনি জিজ্ঞাসা করতে পারেন: "সিআইএর পরিচালক কে?" এবং আপনি একটি সরাসরি উত্তর পাবেন। কিন্তু আপনি কেবলমাত্র "পঠনযোগ্য" গুণাবলীগুলির সাথে কী করতে পারবেন না তা হল সিআইএতে পরিবর্তনগুলি পরিবর্তন করা। উদাহরণস্বরূপ আপনি ফোন কল করতে পারবেন না এবং হঠাৎ সিদ্ধান্ত নিতে চান যে আপনি কিম কারদাসিয়ানকে পরিচালক হতে চান, অথবা আপনি প্যারিস হিল্টনকে চীফ কমান্ডার হতে চান।

  • বৈশিষ্ট্যগুলি আপনাকে "লিখতে" অ্যাক্সেস দেয়, তবে আপনি যদি চান তবে পরিবর্তনগুলি করতে পারেন। অন্যথায়, আপনি করতে পারেন শুধুমাত্র জিনিস পড়া হয়।

    অন্য কথায় অ্যাক্সেসাররা আপনাকে অ্যাক্সেসারগুলি পড়তে বা লেখার অ্যাক্সেস লেখার উপর নির্ভর করে, অন্যথায় বাহ্যিক লোকেদের অনুমতি দেয় না এমন সংস্থানগুলিতে অনুসন্ধান করতে বা পরিবর্তন করতে দেয়।

একটি শ্রেণী ভিতরে বস্তু সহজে একে অপরের অ্যাক্সেস করতে পারেন

  • অন্য দিকে, যদি আপনি ইতিমধ্যেই সিআইএর ভিতরে ছিলেন, তাহলে আপনি সহজেই কাবুলের সিআইএ অপারেটরকে কল করতে পারেন কারণ এই তথ্যটি সহজেই অ্যাক্সেসযোগ্য তবে আপনি ইতিমধ্যেই ভিতরে আছেন। কিন্তু যদি আপনি সিআইএর বাইরে থাকেন তবে আপনাকে কেবল অ্যাক্সেস দেওয়া হবে না: আপনি সেগুলি জানতে পারবেন না (অ্যাক্সেস পড়তে পারেন), এবং আপনি তাদের মিশন (লেখার অ্যাক্সেস) পরিবর্তন করতে পারবেন না।

ক্লাস এবং তাদের মধ্যে ভেরিয়েবল, বৈশিষ্ট্য এবং পদ্ধতি অ্যাক্সেস করার জন্য আপনার ক্ষমতা সঙ্গে একই জিনিস। আছে HTH! কোন প্রশ্ন, জিজ্ঞাসা করুন এবং আমি আশা করি আমি স্পষ্ট করতে পারেন।


গুণাবলী এবং অ্যাক্সেসর পদ্ধতি

গুণাবলী বস্তুর বাইরে থেকে অ্যাক্সেস করা যেতে পারে যে উপাদান উপাদান। তারা অনেক অন্যান্য প্রোগ্রামিং ভাষায় বৈশিষ্ট্য হিসাবে পরিচিত হয়। বস্তুর_নাম.attribute_name হিসাবে, "মান বিন্দু" ব্যবহার করে তাদের মানগুলি অ্যাক্সেসযোগ্য। পাইথন এবং কয়েকটি অন্যান্য ভাষাগুলির বিপরীতে, রুবি বস্তুর বাইরে থেকে ইনস্ট্যান্স ভেরিয়েবলগুলি সরাসরি অ্যাক্সেস করার অনুমতি দেয় না।

class Car
  def initialize
    @wheels = 4  # This is an instance variable
  end
end

c = Car.new
c.wheels     # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500>

উপরের উদাহরণে, সিটি কার শ্রেণীর একটি উদাহরণ (অবজেক্ট)। আমরা বস্তুর বাইরে থেকে চাকার উদাহরণ ভেরিয়েবলের মান পড়তে ব্যর্থতার চেষ্টা করেছি। কি ঘটেছে যে রুবি সি বস্তুর মধ্যে চাকার নামে একটি পদ্ধতি কল করার চেষ্টা করেছিলেন, কিন্তু এই ধরনের কোন পদ্ধতি সংজ্ঞায়িত করা হয় নি। সংক্ষেপে, object_name.attribute_name বস্তুর মধ্যে attribute_name নামে একটি পদ্ধতি কল করার চেষ্টা করে। বাইরে থেকে চাকার ভেরিয়েবলের মানটি অ্যাক্সেস করতে, আমাদের সেই নামের দ্বারা একটি ইনস্ট্যান্স পদ্ধতি বাস্তবায়ন করতে হবে, যা কল করার সময় সেই পরিবর্তনশীলটির মান প্রদান করবে। যে একটি এক্সেসার পদ্ধতি বলা হয়। সাধারণ প্রোগ্রামিং প্রেক্ষাপটে, বস্তুর বাইরে থেকে একটি ইনস্ট্যান্স পরিবর্তনশীল অ্যাক্সেস করার স্বাভাবিক উপায় অ্যাক্সেসার পদ্ধতি বাস্তবায়ন করা, যা গেট্টার এবং সেট্টার পদ্ধতি হিসাবেও পরিচিত। একটি গেটর একটি বর্গের বাইরে একটি শ্রেণীকক্ষে সংজ্ঞায়িত একটি পরিবর্তনশীলের মানকে অনুমোদন দেয় এবং সেটটারটি বাইরের থেকে লিখিত হতে দেয়।

নিচের উদাহরণে, আমরা বস্তুর বাইরে থেকে চাকার ভেরিয়েবল অ্যাক্সেস করতে গাড়ী ক্লাসে গেট্টার এবং সেট্টার পদ্ধতি যোগ করেছি। এই gutters এবং setters সংজ্ঞায়িত "রুবি উপায়" নয়; এটি শুধুমাত্র পেতে এবং বিন্যাস পদ্ধতি কি চিত্রিত করা হয়।

class Car
  def wheels  # getter method
    @wheels
  end

  def wheels=(val)  # setter method
    @wheels = val
  end
end

f = Car.new
f.wheels = 4  # The setter method was invoked
f.wheels  # The getter method was invoked
# Output: => 4

উপরের উদাহরণটি কাজ করে এবং অনুরূপ কোডটি সাধারণত অন্যান্য ভাষার মধ্যে গটার এবং সেট্টার পদ্ধতি তৈরি করতে ব্যবহৃত হয়। যাইহোক, রুবি এটি করার জন্য একটি সহজ উপায় সরবরাহ করে: তিনটি অন্তর্নির্মিত পদ্ধতি called attr_reader, attr_writer এবং attr_acessor। Attr_reader পদ্ধতিটি বাইরে থেকে পাঠযোগ্য পাঠ্যযোগ্য পরিবর্তনশীল করে তোলে, attr_writer এটি লেখার যোগ্য করে তোলে এবং attr_acessor এটি পাঠযোগ্য এবং লেখার যোগ্য করে তোলে।

উপরের উদাহরণটি এরকম পুনঃলিখন করা যেতে পারে।

class Car
  attr_accessor :wheels
end

f = Car.new
f.wheels = 4
f.wheels  # Output: => 4

উপরের উদাহরণে, চাকার বৈশিষ্ট্যটি বস্তুর বাইরে থেকে পাঠযোগ্য এবং লেখার যোগ্য হবে। যদি পরিবর্তে attr_accessor, আমরা attr_reader ব্যবহার করতাম, এটি শুধুমাত্র পঠনযোগ্য হবে। যদি আমরা attr_writer ব্যবহার করি, এটি শুধুমাত্র লিখতে হবে। এই তিনটি পদ্ধতি নিজেদের মধ্যে পেতে এবং পেতে না হয় কিন্তু, যখন বলা হয়, তারা আমাদের জন্য গেট্টার এবং setter পদ্ধতি তৈরি। তারা এমন পদ্ধতি যা গতিশীলভাবে (প্রোগ্রাম্যাটিক্যাল) অন্যান্য পদ্ধতি তৈরি করে; যে metaprogramming বলা হয়।

প্রথম (আরবী) উদাহরণ, যা রবি এর অন্তর্নির্মিত পদ্ধতিগুলিকে কাজে লাগায় না, শুধুমাত্র গটার এবং সেট্টার পদ্ধতিতে অতিরিক্ত কোডের প্রয়োজন হলেই ব্যবহার করা উচিত। উদাহরণস্বরূপ, উদাহরণস্বরূপ পরিবর্তনশীল একটি মান নির্ধারণ করার আগে একটি সেট্টার পদ্ধতি ডেটা যাচাই করতে বা কিছু গণনা করার প্রয়োজন হতে পারে।

Example_variable_get এবং instance_variable_set বিল্ট-ইন পদ্ধতিগুলি ব্যবহার করে, বস্তুর বাইরে থেকে ইনস্ট্যান্স ভেরিয়েবলগুলি অ্যাক্সেস করা (পড়তে এবং লিখতে) সম্ভব। যাইহোক, এই খুব কমই ন্যায্য এবং সাধারণত একটি খারাপ ধারণা, encapsulation বাইপাস হিসাবে সব ধরনের ধ্বংসাবশেষ ধ্বংস করতে থাকে।


আপনি OOP ধারণার সাথে পরিচিত হলে, আপনাকে অবশ্যই গটার এবং সেট্টার পদ্ধতির সাথে পরিচিত হতে হবে। attr_accessor রুবি একই কাজ করে।

সাধারণ পথে গেট্টার এবং সেট্টার

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Eshaan'
person.name # => "Eshaan"

সেটার পদ্ধতি

def name=(val)
  @name = val
end

গেটার পদ্ধতি

def name
  @name
end

Ruby মধ্যে গেট্টার এবং সেট্টার পদ্ধতি

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Eshaan"
person.name # => "Eshaan"

আমি নতুন Rubyists / প্রোগ্রামারদের (নিজেকে মত) confuses কি অংশ মনে হয়:

"আমি কেবলমাত্র কোনও বিশেষ বৈশিষ্ট্য (উদাহরণস্বরূপ, নাম) আছে এমন উদাহরণটি কেন বলতে পারি না এবং সেই গুণটিকে এক মূল্যবোধের মধ্যে একটি মানটি দিতে পারি?"

একটু বেশি সাধারণকরণ, কিন্তু এটি আমার জন্য কীভাবে ক্লিক করেছে:

প্রদত্ত:

class Person
end

আমরা এমন ব্যক্তিকে সংজ্ঞায়িত করি না যেটি এমন কোনও নাম বা অন্য যেকোনো বৈশিষ্ট্য থাকতে পারে।

তাই যদি আমরা তারপর:

baby = Person.new

... এবং তাদের একটি নাম দিতে চেষ্টা করুন ...

baby.name = "Ruth"

রুবিল্যান্ডে, বস্তুর একটি ব্যক্তি শ্রেণি এমন কোনও জিনিস নয় যা "নাম" ধারণ করার সাথে যুক্ত বা সক্ষম হতে পারে তাই আমরা একটি ত্রুটি পেয়েছি ...!

কিন্তু আমরা প্রদত্ত পদ্ধতিগুলির (পূর্ববর্তী উত্তরগুলি দেখুন) ব্যবহার করার উপায় হিসাবে ব্যবহার করতে পারি, "একজন ব্যক্তি শ্রেণীর ( baby ) একটি উদাহরণ এখন 'নাম' নামে একটি বৈশিষ্ট্য থাকতে পারে , তাই আমাদের কাছে কেবল একটি বাক্যযুক্ত পদ্ধতি নেই এবং যে নাম সেটিং, কিন্তু এটা আমাদের তা করার জন্য ইন্দ্রিয় তোলে। "

আবার, এই প্রশ্নটি সামান্য ভিন্ন এবং আরো সাধারণ কোণ থেকে আঘাত করে, তবে আমি আশা করি এটি এই শ্রেণির ব্যক্তিদের পরবর্তী ধাপে সাহায্য করবে যারা এই থ্রেডে যাওয়ার পথ খুঁজে পাবে।


এই মডিউলের জন্য একটি নামযুক্ত বৈশিষ্ট্য নির্ধারণ করে, যেখানে নাম symbol.id2name হয়, একটি ইনস্ট্যান্স পরিবর্তনশীল (@name) তৈরি করে এবং এটি পড়ার জন্য সংশ্লিষ্ট অ্যাক্সেস পদ্ধতি তৈরি করে। এছাড়াও বৈশিষ্ট্য নির্ধারণ করতে name = নামক একটি পদ্ধতি তৈরি করে।

module Mod
  attr_accessor(:one, :two)
end
Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]

একটি বৈশিষ্ট্য অ্যাক্সেসার summarize aka attr_accessor আপনি দুটি বিনামূল্যে পদ্ধতি দেয়।

জাভা লাইক পেতে তারা getters এবং setters বলা হয়।

অনেক উত্তর ভাল উদাহরণ দেখিয়েছে তাই আমি শুধু সংক্ষিপ্ত হতে যাচ্ছি।

#the_attribute

এবং

# The_attribute =

পুরানো রুবি ডক্সগুলিতে একটি হ্যাশ ট্যাগ # মানে একটি পদ্ধতি। এটি একটি ক্লাসের নাম উপসর্গ অন্তর্ভুক্ত করতে পারে ... MyClass # my_method


এটি শুধুমাত্র একটি পদ্ধতি যা উদাহরণ ভেরিয়েবলগুলির জন্য গটার এবং সেট্টার পদ্ধতি সংজ্ঞায়িত করে। একটি উদাহরণ বাস্তবায়ন হবে:

def self.attr_accessor(*names)
  names.each do |name|
    define_method(name) {instance_variable_get("@#{name}")} # This is the getter
    define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter
  end
end

কেবল attr-accessor নির্দিষ্ট বৈশিষ্ট্যগুলির জন্য getter এবং setter পদ্ধতি তৈরি করে


মূলত তারা জাল প্রকাশ্যে অ্যাক্সেসযোগ্য তথ্য বৈশিষ্ট্য, যা রুবি নেই।


সহজভাবে এটি ক্লাসের জন্য একটি setter এবং গর্ত নির্ধারণ করা হবে।

মনে রাখবেন যে

attr_reader :v is equivalant to 
def v
  @v
end

attr_writer :v is equivalant to
def v=(value)
  @v=value
end

সুতরাং

attr_accessor :v which means 
attr_reader :v; attr_writer :v 

ক্লাসের জন্য একটি setter এবং গেটর সংজ্ঞায়িত সমান হয়।


attr_accessor শুধু একটি পদ্ধতি । (লিঙ্কটি কীভাবে কাজ করে সে সম্পর্কে আরও অন্তর্দৃষ্টি সরবরাহ করবে - তৈরি পদ্ধতিগুলির জোড়াগুলি দেখুন এবং টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন তা আপনাকে দেখানো উচিত।)

কৌশলটি রুবিতে রবি (এটি "সি ++ এবং জাভা" ভাষাগুলিতে "কেবলমাত্র সংজ্ঞা") নয়, তবে এটি একটি অভিব্যক্তি যা মূল্যায়ন করে । এটি এই মূল্যায়নের সময় যখন attr_accessor পদ্ধতি প্রয়োগ করা হয় যা বর্তমান শ্রেণীকে পরিবর্তিত করে - নিখুঁত রিসিভারটি মনে self.attr_accessor : self.attr_accessor , যেখানে self এই সময়ে "খোলা" শ্রেণী বস্তু।

attr_accessor এবং বন্ধুদের জন্য প্রয়োজন, ভাল:

  1. স্মলটক মত রুবি, ঐ বস্তুর জন্য পদ্ধতি 1 এর বাইরে ইনস্ট্যান্স ভেরিয়েবল অ্যাক্সেস করার অনুমতি দেয় না। অর্থাৎ, উদাহরণস্বরূপ ভেরিয়েবলগুলি xy ফর্মটিতে অ্যাক্সেস করা যাবে না যেমন সাধারণ, জাভা বা এমনকি পাইথন। রুবি y সবসময় পাঠানোর বার্তা হিসাবে গ্রহণ করা হয় (অথবা "কল করার পদ্ধতি")। সুতরাং attr_* পদ্ধতিগুলি attr_* তৈরি করে যা গতিশীলভাবে তৈরি পদ্ধতিগুলির মাধ্যমে @variable অ্যাক্সেসের উদাহরণ প্রক্সি করে।

  2. Boilerplate sucks

এই সামান্য বিবরণ কিছু ব্যাখ্যা করে আশা করি। শুভ কোডিং।

1 এটি কঠোরভাবে সত্য নয় এবং এর আশেপাশে কিছু "কৌশল" রয়েছে , তবে "সর্বজনীন দৃষ্টান্ত পরিবর্তনশীল" অ্যাক্সেসের জন্য কোন সিনট্যাক্স সমর্থন নেই।


attr_accessor (হিসাবে @ pst বলেন) শুধু একটি পদ্ধতি। এটা কি আপনার জন্য আরো পদ্ধতি তৈরি করা হয়।

সুতরাং এখানে এই কোড:

class Foo
  attr_accessor :bar
end

এই কোড সমতুল্য:

class Foo
  def bar
    @bar
  end
  def bar=( new_value )
    @bar = new_value
  end
end

রুবিতে আপনি নিজে এই পদ্ধতির পদ্ধতি লিখতে পারেন:

class Module
  def var( method_name )
    inst_variable_name = "@#{method_name}".to_sym
    define_method method_name do
      instance_variable_get inst_variable_name
    end
    define_method "#{method_name}=" do |new_value|
      instance_variable_set inst_variable_name, new_value
    end
  end
end

class Foo
  var :bar
end

f = Foo.new
p f.bar     #=> nil
f.bar = 42
p f.bar     #=> 42




ruby