রুবিতে অ্যাটার_একসেসর কী?


1022

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



1
আতর_একসেসর কি গিতে এইভাবে কাজ করে? আমি খুঁজে পেয়েছি যে কিছু টিউটোরিয়াল যথেষ্ট পরিমাণে ব্যাখ্যা করে না এবং অন্যরা পূর্বের জ্ঞান ধরে নেয়।
অ্যাঞ্জেলফায়ার্নজে

10
@ অ্যাঞ্জেলফায়ার্নিজের, এর gitসাথে কিছু করার নেই attr_accessor। গিট একটি সংস্করণ নিয়ন্ত্রণ সফ্টওয়্যার, অন্যদিকে রুবিরattr_accessor একটি পদ্ধতি
উজবেজোন

উত্তর:


2358

ধরা যাক আপনার একটা ক্লাস আছে Person

class Person
end

person = Person.new
person.name # => no method error

স্পষ্টতই আমরা পদ্ধতিটি কখনই সংজ্ঞায়িত করি না name। আসুন এটি করা যাক।

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

আহা, আমরা নামটি পড়তে পারি, তবে এর অর্থ এই নয় যে আমরা নামটি নির্ধারণ করতে পারি। সেগুলি দুটি ভিন্ন পদ্ধতি। প্রাক্তনকে পাঠক বলা হয় এবং আধুনিককে বলা হয় লেখক । আমরা এখনও লেখক তৈরি করি নি তাই চলুন।

class Person
  def name
    @name
  end

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

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

অসাধারণ. এখন আমরা @nameপাঠক এবং লেখক পদ্ধতি ব্যবহার করে উদাহরণ পরিবর্তনশীল লিখতে এবং পড়তে পারি । ব্যতীত, এটি এত ঘন ঘন করা হয়, কেন প্রতিবার এই পদ্ধতিগুলি লেখার সময় নষ্ট করবেন? আমরা এটি আরও সহজ করতে পারি।

class Person
  attr_reader :name
  attr_writer :name
end

এমনকি এটি পুনরাবৃত্তি পেতে পারে। আপনি যখন পাঠক এবং লেখক উভয়ই কেবল অ্যাক্সেসর ব্যবহার করতে চান!

class Person
  attr_accessor :name
end

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

একইভাবে কাজ করে! এবং অনুমান করুন: @nameআমাদের ব্যক্তি অবজেক্টে উদাহরণ পরিবর্তনশীল ঠিক একইভাবে সেট করা হবে যখন আমরা ম্যানুয়ালি করেছিলাম, যাতে আপনি এটি অন্যান্য পদ্ধতিতে ব্যবহার করতে পারেন।

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

এটাই. কীভাবে attr_reader, attr_writerএবং attr_accessorপদ্ধতিগুলি আপনার জন্য পদ্ধতিগুলি উত্পন্ন করে তা বুঝতে , অন্যান্য উত্তর, বই, রুবি ডকস পড়ুন।


46
@ হাকুনিন - এই স্পষ্ট উত্তরের জন্য আপনাকে ধন্যবাদ। আমার জন্য যা অনুপস্থিত তা হ'ল কেন রুবি সিনট্যাক্সটি অ্যাটর_ * বিবৃতিতে উদাহরণের পরিবর্তনশীলগুলির জন্য একটি কোলন ':' প্রস্তাব দেয়? দেখে মনে হচ্ছে যে ভেরিয়েবলটি উল্লেখ করতে ক্লাসের অন্য কোথাও ব্যবহৃত একই '@' সিনট্যাক্সটি ব্যবহার করা আরও সোজা হবে।
উইল

207
@ উইলিয়ামস্মিথ আপনার প্রশ্নের উত্তর দেওয়ার জন্য আপনার এটি বুঝতে হবে যে attr_accessorএটি বর্তমান শ্রেণীর কাছে ডাকা একটি পদ্ধতি এবং :nameআপনি সেই পদ্ধতিতে পাস হওয়া একটি প্যারামিটার। এটি কোনও বিশেষ সিনট্যাক্স নয়, এটি একটি সহজ পদ্ধতি কল। আপনি যদি এটি @nameপরিবর্তনশীল দিতে চান তবে এটির কোনও অর্থ হবে না, কারণ @ নামটি ধারণ করে nil। সুতরাং এটি লেখার মত হবে attr_accessor nil। আপনি এটিকে যে চলকটি তৈরি করতে হবে তা এটি পাস করছেন না, আপনি যে নামটি পরিবর্তনশীল বলতে চান তা আপনি প্রেরণ করছেন।
সর্বোচ্চ চেরনিয়াক

23
@ হাকুনিন - এটি মোটামুটি বোঝায়। আমি কেবল আজ শিখছি যে রুবি আসলে 'চলমান' কারণ এটি কোনও ফাইলের মাধ্যমে বিশ্লেষণ করে এবং প্রতিটি বিবৃতি এবং অভিব্যক্তি আসলে কোনও কোনও বস্তুর জন্য মেথড কল। অ্যাটর_অ্যাক্সেসর সহ। খুব উপকারী.
উইল

52
3 বছর ধরে রেলগুলি ব্যবহার করা হয়েছিল, এটি কখনও জানত না। লজ্জা
শান জিয়াও

5
@ বুমিন্ডা হ্যাঁ, তবে পদ্ধতি nameএবং পরিবর্তনশীল @nameএক জিনিস নয়। তাদের বিভ্রান্ত করবেন না। @nameআপনার ক্লাসে আপনার উদাহরণ পরিবর্তনশীল আছে এবং আপনি attr_reader :nameএটি বাইরে থেকে পড়তে সক্ষম হতে সংজ্ঞায়িত করেন। আপনার ক্লাসের বাইরের attr_readerঅ্যাক্সেসের কোনও সহজ উপায় ছাড়াই @name
ম্যাক্স চের্নিয়াক

127

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

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

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

  1. রুবি, স্মলটালকের মতো, object বস্তুর জন্য পদ্ধতি 1 এর বাইরে উদাহরণ ভেরিয়েবলগুলি অ্যাক্সেস করার অনুমতি দেয় না । অর্থাত্ x.y, জাভা বা পাইথন হিসাবে যেমন প্রচলিত যেমন ফর্মের মধ্যে উদাহরণ ভেরিয়েবলগুলি অ্যাক্সেস করা যায় না । রুবিতে yসর্বদা পাঠানোর বার্তা হিসাবে নেওয়া হয় (বা "কল করার পদ্ধতি")। সুতরাং attr_*পদ্ধতিগুলি মোড়ক তৈরি করে যা @variableপ্রকৃতির তৈরি পদ্ধতিগুলির মাধ্যমে উদাহরণটি অ্যাক্সেস করে।

  2. বয়লারপ্লেট চুষে দেয়

আশা করি এটি কিছু ছোটখাটো বিবরণ স্পষ্ট করে দিয়েছে। শুভ কোডিং।


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


আপনি যখন বলেন অ্যাটর_অ্যাক্সেসরটি "কেবল একটি পদ্ধতি" আমি তা পেয়ে যাই। কিন্তু সিনট্যাক্সটি কী সেই পদ্ধতিটি কল করতে ব্যবহৃত হয় ? রুবি ডকুমেন্টেশনের অংশটি সন্ধান করতে আমার সমস্যা হচ্ছে যা সিনট্যাক্সের মতো কিছু_মাদৃত: নাম => "যাই হোক না কেন",: নটরনাম, ইত্যাদি ইত্যাদির বিষয়ে কথা বলেছে
বিটি

68

attr_accessor(যেমন @ পিএসটি বলেছেন) কেবল একটি পদ্ধতি। এটি যা করে তা আপনার জন্য আরও পদ্ধতি তৈরি করে।

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

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

3
এটি এমনকি শুরুর স্তরের পরিস্থিতিতে এমনকি যেখানে রূপক ব্যবহার ব্যবহৃত হয় তার একটি দুর্দান্ত উদাহরণ। খুব সুন্দর.
জন সাইমন

2
আমি একটি বাস্তবায়নের স্কেচ খুঁজছিলাম attr_accessorএবং শেষ পর্যন্ত এখানে পেয়েছি! যদিও এটি আমার সমস্যার সমাধান করেছে, তবে আমি জানতে আগ্রহী যে কোথায় (পুস্তক / অফিসিয়াল ডক) আমি এর মতো বাস্তবায়নের উদাহরণ খুঁজে পাব?
ওয়াসিফ হোসেন

40

attr_accessor খুব সহজ:

attr_accessor :foo

এর জন্য একটি শর্টকাট:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

এটি কোনও অবজেক্টের জন্য গেটর / সেটার ছাড়া আর কিছুই নয়


10
আপনার উত্তর ঠিক আছে। "শর্টকাট" এর অর্থ আমার অভিধান অনুসারে "একটি সংক্ষিপ্ত বিকল্প পথ", "সিনট্যাক্স চিনির" বা "দোভাষী দ্বারা ব্যাখ্যা করা ম্যাক্রো" নয়।
বোলসেন্সিয়র

25

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


4
যদিও এই মন্তব্যটি পুরোপুরি কার্যকর না হলেও এটি সত্য। রুবিতে "পান" পদ্ধতির বাইরে জনসাধারণের ডেটা অ্যাট্রিবিউটগুলি অস্তিত্বের বিষয়টিকে আলোকপাত করে, যা ভাষা শেখার চেষ্টা করার জন্য কারও পক্ষে সত্যই দরকারী তথ্য।
এরিক ডান্ড

3
এটি সত্যিই হ্রাস করা উচিত নয়। একজন রুবিহীন লোক এই জিনিসটি বের করার চেষ্টা করায়, এই উত্তরটি খুব সহায়ক!
ব্র্যাড

1
সম্মত, সি # এর নাম {পেতে খুব সিমিলার বলে মনে হচ্ছে; সেট;}
ডেভিড মিলার

17

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

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

একাধিক বৈশিষ্ট্য এইভাবে পরিচালনা করা দুর্দান্ত!
ওয়াসিফ হোসেন

আমি রূপকল্পের সাথে সম্পর্কিত আমার অন্য একটি প্রশ্নের সমাধানের জন্য এটি একটি সত্যই সহায়ক কোড স্নিপেট ছিল।
alexventuraio

15

কোনও কোড ছাড়াই সরল ব্যাখ্যা

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

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

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

  • আপনি যদি সিআইএর বাইরে থাকেন তবে আপনি কেবলমাত্র জনসাধারণের জন্য উপলভ্য করা তথ্যই অ্যাক্সেস করতে পারবেন। অথবা সিআইএ পার্লেন্স ব্যবহার করতে আপনি কেবল "সাফ করা" তথ্যই অ্যাক্সেস করতে পারবেন।

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

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

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

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

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

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

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

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


আপনার ব্যাখ্যাটি বোঝায়! +1 দুঃখিত, আপনি কি নিশ্চিত যে অভিব্যক্তি "সিআইএ দ্বারা সাফ করা তথ্য সঠিক?
কৌটি

সিআইএতে বিভিন্ন "ছাড়পত্র" স্তর রয়েছে: যেমন শীর্ষ সিক্রেট (প্রেজ ছাড়া আর কেউ নয়), বা জনসাধারণের আস্থা (প্রত্যেকে সেই তথ্যটি পড়তে পারে)। সিআইএ আসলে খুব শীতল তথ্য সরবরাহ করে!
বিকেএসপুরজন

আপনি কেবল কারদাশিয়ান, প্যারিস হিল্টনের উদাহরণগুলির জন্য উত্সাহের প্রাপ্য :) আমি ভেবেছিলাম প্রেসিডেন্টের পক্ষে ট্রাম্পের পক্ষে এটি যথেষ্ট খারাপ ছিল না, এই দুই দায়িত্বে থাকা ওএমজি কল্পনা করুন!
আরএমসিচারি

হ্যাঁ! আমাদের যা প্রয়োজন, কোড ছাড়াই স্ট্যাকওভারফ্লো! :-)
মার্ভিন

13

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

জেনারেট ওয়ে ইন গেটর এবং সেটার

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

রুবিতে গেটর এবং সেটার পদ্ধতি

class Person
  attr_accessor :name
end

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

2
নিখুঁত ব্যাখ্যা! এটি খুব সহজ আচরণ এবং খুব সহজেই ওভাররাইড করা যায়।
রুব্রিডার

12

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

পদ্ধতিটি আরম্ভ করুন

ইনিশিয়েল করা আপনাকে ক্লাসের নতুন ইভেন্ট তৈরির সময় আপনার কোডের একটি পৃথক লাইনে সেট করার চেয়ে উদাহরণ তৈরি করার সময় কোনও অবজেক্টের উদাহরণে ডেটা সেট করার অনুমতি দেয়।

class Person

  def initialize(name)
    @name = name
  end


  def greeting
    "Hello #{@name}"
  end
end

person = Person.new("Denis")
puts person.greeting

উপরের কোডে আমরা ডেনিসকে প্রাথমিক অবস্থায় প্যারামিটার দিয়ে পাস করে প্রাথমিককরণ পদ্ধতিটি ব্যবহার করে "ডেনিস" নামটি সেট করছি। আমরা যদি আরম্ভের পদ্ধতি ছাড়া নামটি সেট করতে চাইতাম তবে আমরা এটির মতো এটি করতে পারতাম:

class Person
  attr_accessor :name

  # def initialize(name)
  #     @name = name
  # end

  def greeting
    "Hello #{name}"
  end
end

person = Person.new
person.name = "Dennis"
puts person.greeting

উপরের কোডে, আমরা অবজেক্টের সূচনাতে মানগুলি সেট করার পরিবর্তে person.name ব্যবহার করে attr_accessor সেটার পদ্ধতিতে কল করে নামটি সেট করি।

এই কাজটি করার উভয়ই "পদ্ধতি", তবে আরম্ভ করা আমাদের সময় এবং কোডের লাইনগুলি সাশ্রয় করে।

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

উত্সর্গকারী, সেটার্স (অ্যাট্রি_ড্রেডার, অ্যাট্রি_রাইটার, অ্যাট্রি_অ্যাকসেসর)

প্রাপ্তি, অ্যাট্রি_ড্রেডার: গেটারের পুরো উদ্দেশ্যটি হ'ল একটি নির্দিষ্ট উদাহরণের ভেরিয়েবলের মান ফেরত দেওয়া। এটির একটি ব্রেকডাউন করার জন্য নীচের নমুনা কোডটি দেখুন।

class Item

  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

  def item_name
    @item_name
  end

  def quantity
     @quantity
  end
end

example = Item.new("TV",2)
puts example.item_name
puts example.quantity

উপরের কোডে আপনি আইটেমের উদাহরণ হিসাবে "আইটেম_নাম" এবং "পরিমাণ" পদ্ধতিটি "উদাহরণ" বলছেন। "উদাহরণস্বরূপ.ইটিএম_নাম" এবং "উদাহরণসুন্দরটি" প্যারামিটারগুলির মান "উদাহরণস্বরূপ" ফিরে আসবে (বা "পাবেন") এবং তাদের পর্দায় প্রদর্শিত হবে।

ভাগ্যক্রমে রুবিতে একটি অন্তর্নিহিত পদ্ধতি রয়েছে যা আমাদের এই কোডটি আরও সংক্ষেপে লিখতে দেয়; attr_reader পদ্ধতি। নীচের কোডটি দেখুন;

class Item

attr_reader :item_name, :quantity

  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

end

item = Item.new("TV",2)
puts item.item_name
puts item.quantity

এই বাক্য গঠনটি ঠিক একইভাবে কাজ করে, কেবল এটি আমাদের ছয় লাইনের কোড সংরক্ষণ করে। ভাবুন আইটেম ক্লাসে যদি আপনার আরও 5 টি রাষ্ট্রীয় বৈশিষ্ট্যযুক্ত থাকে? কোডটি খুব তাড়াতাড়ি পেতে হবে।

সেটার, অ্যাট্রি_উইটার: সেটার পদ্ধতির সাহায্যে প্রথমে আমাকে যে বিষয়টি অতিক্রম করেছে তা হ'ল আমার চোখে মনে হয় এটি আরম্ভের পদ্ধতিতে অভিন্ন ফাংশন সম্পাদন করেছে। নীচে আমি আমার বোঝার উপর ভিত্তি করে পার্থক্য ব্যাখ্যা;

যেমন আগেই বলা হয়েছে, ইনিশিয়ালাইজড পদ্ধতি আপনাকে অবজেক্ট তৈরির উপর কোনও বস্তুর উদাহরণের জন্য মানগুলি সেট করতে দেয়।

তবে আপনি যদি উদাহরণটি তৈরির পরে পরে মানগুলি সেট করতে চান বা সেগুলি আরম্ভ করার পরে সেগুলি পরিবর্তন করতে চান? এটি এমন একটি দৃশ্য হবে যেখানে আপনি একটি সেটার পদ্ধতি ব্যবহার করবেন। যে পার্থক্য। আপনি প্রাথমিকভাবে যখন অ্যাটর_রাইটার পদ্ধতিটি ব্যবহার করছেন তখন আপনাকে একটি নির্দিষ্ট রাষ্ট্র "সেট" করতে হবে না।

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

class Item

attr_reader :item_name

  def item_name=(str)
    @item_name = (str)
  end

end

নীচের কোডটি আবার আমাদের কোডটি সংক্ষিপ্ত করে আমাদের সময় বাঁচাতে অ্যাটর_উইটার ব্যবহার করার একটি উদাহরণ।

class Item

attr_reader :item_name
attr_writer :item_name

end

item = Item.new
puts item.item_name = "TV"

নীচের কোডটি যেখানে আমরা তৈরির পরে আইটেম_নামের অবজেক্টের মান সেট করতে ইনিশিয়ালাইজটি ব্যবহার করছি তার উপরের সূচনা উদাহরণের পুনরাবৃত্তি।

class Item

attr_reader :item_name

  def initialize(item_name)
    @item_name = item_name
  end

end

item = Item.new("TV")
puts item.item_name

attr_accessor: আপনাকে কোডের আরও একটি লাইন সাশ্রয় করে attr_reader এবং attr_writer উভয়ের ফাংশন সম্পাদন করে।


10

আমি মনে করি যে নতুন রুবিবাদক / প্রোগ্রামারগুলিকে (আমার মতো) গুলিয়ে দেয় তার একটি অংশ:

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

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

প্রদত্ত:

class Person
end

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

সুতরাং আমরা যদি তারপর:

baby = Person.new

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

baby.name = "Ruth"

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

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

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


7

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

মনে রাখবেন যে

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 

শ্রেণীর জন্য একটি সেটার এবং গেটর সংজ্ঞায়নের সমতুল্য।


5

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


5

এটি বোঝার আরেকটি উপায় হ'ল এটি কী ত্রুটি কোডটি রয়েছে তা দ্বারা নির্মূল করে attr_accessor

উদাহরণ:

class BankAccount    
  def initialize( account_owner )
    @owner = account_owner
    @balance = 0
  end

  def deposit( amount )
    @balance = @balance + amount
  end

  def withdraw( amount )
    @balance = @balance - amount
  end
end

নিম্নলিখিত পদ্ধতি উপলব্ধ:

$ bankie = BankAccout.new("Iggy")
$ bankie 
$ bankie.deposit(100)
$ bankie.withdraw(5)

নিম্নলিখিত পদ্ধতিগুলি ত্রুটি ছুড়ে ফেলে:

$ bankie.owner     #undefined method `owner'... 
$ bankie.balance   #undefined method `balance'...

ownerএবং balanceপ্রযুক্তিগতভাবে একটি পদ্ধতি নয় , তবে একটি বৈশিষ্ট্য। ব্যাংক অ্যাকাউন্টস ক্লাস নেই def ownerএবং আছে def balance। যদি এটি হয় তবে আপনি নীচের দুটি কমান্ড ব্যবহার করতে পারেন। তবে এই দুটি পদ্ধতি নেই। যাইহোক, আপনি বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন যেমন আপনি কোনও পদ্ধতির মাধ্যমে অ্যাক্সেস করেছেনattr_accessor !! সুতরাং শব্দattr_accessor । অ্যাট্রিবিউট। অ্যাকসেসর। এটি কোনও বৈশিষ্ট্যে অ্যাক্সেস করার মতো বৈশিষ্ট্যগুলিতে অ্যাক্সেস করে।

যোগ করা attr_accessor :balance, :ownerআপনাকে পড়তে এবং লিখতে balanceএবং owner"পদ্ধতি" মঞ্জুরি দেয় । এখন আপনি শেষ 2 টি পদ্ধতি ব্যবহার করতে পারেন।

$ bankie.balance
$ bankie.owner

2

এই মডিউলের জন্য একটি নামযুক্ত বৈশিষ্ট্য নির্ধারণ করে, যেখানে নামটি প্রতীক.আইডি 2 নাম, একটি দৃষ্টান্ত ভেরিয়েবল (@ নাম) তৈরি করে এটি পড়ার জন্য একটি সম্পর্কিত অ্যাক্সেস পদ্ধতি। বৈশিষ্ট্য নির্ধারণ করতে নাম = নামে একটি পদ্ধতিও তৈরি করে।

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

1

একটি অ্যাট্রিবিউট অ্যাকসেসর ওরফে অ্যাটর_একসেসর সংক্ষিপ্ত করতে আপনাকে দুটি বিনামূল্যে পদ্ধতি দেয়।

জাভা এর মতো তারা গেটারস এবং সেটটার নামে ডাকে।

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

#the_attribute

এবং

# The_attribute =

পুরানো রুবি ডক্সে একটি হ্যাশ ট্যাগ # এর অর্থ একটি পদ্ধতি। এটিতে একটি শ্রেণীর নামের উপসর্গও অন্তর্ভুক্ত থাকতে পারে ... মাই ক্লাস # মাই_মোথডো


1

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

class Foo
  attr_accessor 'myvar'
  def initialize
    @myvar = "A"
    myvar = "B"
    puts @myvar # A
    puts myvar # B - myvar declared above overrides myvar method
  end

  def test
    puts @myvar # A
    puts myvar # A - coming from myvar accessor

    myvar = "C" # local myvar overrides accessor
    puts @myvar # A
    puts myvar # C

    send "myvar=", "E" # not running "myvar =", but instead calls setter for @myvar
    puts @myvar # E
    puts myvar # C
  end
end

0

বৈশিষ্ট্য এবং অ্যাক্সেসর পদ্ধতি

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

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>

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

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

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

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

উপরের উদাহরণটি আবার লিখতে পারে।

class Car
  attr_accessor :wheels
end

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

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

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

উদাহরণ_ভ্যারেবল_জেট এবং দৃষ্টান্ত পরিবর্তনযোগ্য_সেট অন্তর্নির্মিত পদ্ধতিগুলি ব্যবহার করে অবজেক্টের বাইরে থেকে উদাহরণের ভেরিয়েবলগুলি অ্যাক্সেস (পঠন এবং লিখন) পাওয়া সম্ভব। যাইহোক, এটি খুব কমই ন্যায়সঙ্গত এবং সাধারণত একটি খারাপ ধারণা, কারণ এনক্যাপসুলেশনকে বাইপাস করা সমস্ত ধরণের সর্বনাশকে নষ্ট করে।


-2

হুম। প্রচুর ভাল উত্তর। এটিতে আমার কয়েকটি সেন্ট রয়েছে।

  • attr_accessorএটি একটি সহজ পদ্ধতি যা পুনরাবৃত্তি করার পদ্ধতিগুলি পরিষ্কার করতে ( DRY-ING ) আমাদের সহায়তা করে ।getter and setter

  • যাতে আমরা ব্যবসায়ের যুক্তি লেখায় আরও ফোকাস করতে পারি এবং সেটার এবং গেটারদের নিয়ে চিন্তা না করে।


-3

অন্যগুলির চেয়ে অ্যাটর_সেসসারের মূল কার্যকারিতা হ'ল অন্যান্য ফাইল থেকে ডেটা অ্যাক্সেস করার ক্ষমতা।
সুতরাং আপনার কাছে সাধারণত অ্যাট্রি_ড্রেডার বা অ্যাটর_উইটার থাকে তবে সুসংবাদটি হ'ল রুবি আপনাকে এই দু'টিকে একত্রে_অ্যাক্সেসরের সাথে একত্রিত করতে দেয়। আমি এটি হিসাবে মনে করি আমার যাওয়ার পদ্ধতিকারণ এটি আরও ভাল গোলাকার বা বহুমুখী। এছাড়াও, মনে রাখবেন যে জেলগুলিতে, এটি নির্মূল হয় কারণ এটি এটি আপনার শেষ প্রান্তে করে। সুতরাং অন্য কথায়: আপনি অন্য দু'টির তুলনায় অ্যাট্রি_সেসর ব্যবহার করা ভাল better কারণ আপনার নির্দিষ্ট হওয়ার বিষয়ে চিন্তা করার দরকার নেই, অ্যাক্সেসরটি এটিকে সমস্ত .েকে রাখে। আমি জানি এটি আরও সাধারণ ব্যাখ্যা তবে এটি আমাকে শিক্ষানবিশ হিসাবে সহায়তা করেছিল।

আশা করি এটি সাহায্য করেছে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.