আমি একটি কঠিন সময় বুঝতে হচ্ছে attr_accessor
মধ্যে রুবি ।
কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে?
আমি একটি কঠিন সময় বুঝতে হচ্ছে attr_accessor
মধ্যে রুবি ।
কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে?
উত্তর:
ধরা যাক আপনার একটা ক্লাস আছে 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
পদ্ধতিগুলি আপনার জন্য পদ্ধতিগুলি উত্পন্ন করে তা বুঝতে , অন্যান্য উত্তর, বই, রুবি ডকস পড়ুন।
attr_accessor
এটি বর্তমান শ্রেণীর কাছে ডাকা একটি পদ্ধতি এবং :name
আপনি সেই পদ্ধতিতে পাস হওয়া একটি প্যারামিটার। এটি কোনও বিশেষ সিনট্যাক্স নয়, এটি একটি সহজ পদ্ধতি কল। আপনি যদি এটি @name
পরিবর্তনশীল দিতে চান তবে এটির কোনও অর্থ হবে না, কারণ @ নামটি ধারণ করে nil
। সুতরাং এটি লেখার মত হবে attr_accessor nil
। আপনি এটিকে যে চলকটি তৈরি করতে হবে তা এটি পাস করছেন না, আপনি যে নামটি পরিবর্তনশীল বলতে চান তা আপনি প্রেরণ করছেন।
name
এবং পরিবর্তনশীল @name
এক জিনিস নয়। তাদের বিভ্রান্ত করবেন না। @name
আপনার ক্লাসে আপনার উদাহরণ পরিবর্তনশীল আছে এবং আপনি attr_reader :name
এটি বাইরে থেকে পড়তে সক্ষম হতে সংজ্ঞায়িত করেন। আপনার ক্লাসের বাইরের attr_reader
অ্যাক্সেসের কোনও সহজ উপায় ছাড়াই @name
।
attr_accessor হয় মাত্র একটি পদ্ধতি । (লিঙ্কটি কীভাবে এটি কাজ করে তার আরও অন্তর্দৃষ্টি দেওয়া উচিত - উত্পন্ন পদ্ধতিগুলির জোড়গুলি দেখুন এবং একটি টিউটোরিয়াল আপনাকে এটি কীভাবে ব্যবহার করতে হবে তা দেখানো উচিত))
কৌতুক যে class
হয় একটি সংজ্ঞা না রুবি (এটা হল "শুধু একটি সংজ্ঞা" সি ++ এবং জাভা মত ভাষায়), কিন্তু এটি একটি হল যে মূল্যায়ণ অভিব্যক্তি । এই মূল্যায়নকালে যখন attr_accessor
পদ্ধতিটি আহ্বান করা হয় যা পরিবর্তিতভাবে বর্তমান বর্গকে সংশোধন করে - অন্তর্নিহিত রিসিভারটি মনে রাখবেন: এই মুহুর্তে "উন্মুক্ত" শ্রেণীর অবজেক্টটি self.attr_accessor
কোথায় self
রয়েছে।
প্রয়োজন attr_accessor
এবং বন্ধুদের জন্য, ভাল:
রুবি, স্মলটালকের মতো, object বস্তুর জন্য পদ্ধতি 1 এর বাইরে উদাহরণ ভেরিয়েবলগুলি অ্যাক্সেস করার অনুমতি দেয় না । অর্থাত্ x.y
, জাভা বা পাইথন হিসাবে যেমন প্রচলিত যেমন ফর্মের মধ্যে উদাহরণ ভেরিয়েবলগুলি অ্যাক্সেস করা যায় না । রুবিতে y
সর্বদা পাঠানোর বার্তা হিসাবে নেওয়া হয় (বা "কল করার পদ্ধতি")। সুতরাং attr_*
পদ্ধতিগুলি মোড়ক তৈরি করে যা @variable
প্রকৃতির তৈরি পদ্ধতিগুলির মাধ্যমে উদাহরণটি অ্যাক্সেস করে।
বয়লারপ্লেট চুষে দেয়
আশা করি এটি কিছু ছোটখাটো বিবরণ স্পষ্ট করে দিয়েছে। শুভ কোডিং।
1 এটি কঠোরভাবে সত্য নয় এবং এর চারপাশে কিছু "কৌশল" রয়েছে তবে "সার্বজনীন দৃষ্টান্ত পরিবর্তনশীল" অ্যাক্সেসের জন্য সিনট্যাক্স সমর্থন নেই।
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
attr_accessor
এবং শেষ পর্যন্ত এখানে পেয়েছি! যদিও এটি আমার সমস্যার সমাধান করেছে, তবে আমি জানতে আগ্রহী যে কোথায় (পুস্তক / অফিসিয়াল ডক) আমি এর মতো বাস্তবায়নের উদাহরণ খুঁজে পাব?
attr_accessor
খুব সহজ:
attr_accessor :foo
এর জন্য একটি শর্টকাট:
def foo=(val)
@foo = val
end
def foo
@foo
end
এটি কোনও অবজেক্টের জন্য গেটর / সেটার ছাড়া আর কিছুই নয়
মূলত তারা প্রকাশ্যে অ্যাক্সেসযোগ্য ডেটা অ্যাট্রিবিউটগুলি নকল করে, যা রুবির নেই।
এটি কেবলমাত্র এমন একটি পদ্ধতি যা উদাহরণস্বরূপ ভেরিয়েবলের জন্য গেটর এবং সেটার পদ্ধতিগুলি সংজ্ঞায়িত করে। একটি উদাহরণ বাস্তবায়ন হবে:
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
উপরের উত্তরগুলির বেশিরভাগটি কোড ব্যবহার করে। এই ব্যাখ্যাটি কোনও উপমা / গল্পের মাধ্যমে কোনও ব্যবহার না করেই উত্তর দেওয়ার চেষ্টা করে:
বাইরের দলগুলি সিআইএর অভ্যন্তরীণ গোপনীয়তাগুলি অ্যাক্সেস করতে পারে না
আসুন একটি সত্যই গোপন জায়গা কল্পনা করা যাক: সিআইএ। সিআইএর অভ্যন্তরীণ লোকদের বাদে সিআইএতে কী ঘটছে তা কেউ জানে না। অন্য কথায়, বহিরাগত লোকেরা সিআইএ-তে কোনও তথ্য অ্যাক্সেস করতে পারে না। তবে পুরোপুরি গোপনীয় কোনও সংস্থা থাকার পক্ষে এটি ভাল নয়, নির্দিষ্ট তথ্য বাইরের বিশ্বের কাছে সরবরাহ করা হয় - সিআইএ অবশ্যই যে বিষয়গুলি অবশ্যই প্রত্যেককে জানতে চায়: উদাহরণস্বরূপ সিআইএর পরিচালক, এই বিভাগটিকে কীভাবে পরিবেশবান্ধব সাথে তুলনা করা হচ্ছে? অন্যান্য সমস্ত সরকারী দফতরের জন্য ইত্যাদি অন্যান্য তথ্য: যেমন ইরাক বা আফগানিস্তানের এর গোপন কর্মীরা - এই ধরণের জিনিস সম্ভবত পরবর্তী ১৫০ বছর গোপনীয় থাকবে।
আপনি যদি সিআইএর বাইরে থাকেন তবে আপনি কেবলমাত্র জনসাধারণের জন্য উপলভ্য করা তথ্যই অ্যাক্সেস করতে পারবেন। অথবা সিআইএ পার্লেন্স ব্যবহার করতে আপনি কেবল "সাফ করা" তথ্যই অ্যাক্সেস করতে পারবেন।
সিআইএ যে তথ্য সিআইএর বাইরে সাধারণ মানুষের কাছে সরবরাহ করতে চায় সেগুলি বলা হয়: গুণাবলী।
গুণাবলী পড়ার এবং লেখার অর্থ:
সিআইএর ক্ষেত্রে বেশিরভাগ বৈশিষ্ট্যগুলি "কেবলমাত্র পঠনযোগ্য" are এর অর্থ আপনি যদি সিআইএর বহিরাগত দল হন, আপনি জিজ্ঞাসা করতে পারেন: "সিআইএর পরিচালক কে?" এবং আপনি একটি সরাসরি উত্তর পাবেন। তবে আপনি কেবল "পঠনযোগ্য" বৈশিষ্ট্যগুলি যা করতে পারবেন না তা হ'ল সিআইএতে পরিবর্তনগুলি করা। উদাহরণস্বরূপ আপনি কোনও ফোন কল করতে পারবেন না এবং হঠাৎ সিদ্ধান্ত নিতে পারবেন যে আপনি কিম কারদাশিয়ানকে পরিচালক হতে চান বা আপনি প্যারিস হিল্টনকে সর্বাধিনায়ক হতে চান।
যদি বৈশিষ্ট্যগুলি আপনাকে "লেখার" অ্যাক্সেস দেয় তবে আপনি বাইরে থাকলেও আপনি চাইলে পরিবর্তন করতে পারেন। অন্যথায়, আপনি যা করতে পারেন তা কেবল পড়ুন।
অন্য কথায় অ্যাকসেসরগুলি আপনাকে এমন সংস্থাগুলিতে অনুসন্ধান বা পরিবর্তন করার অনুমতি দেয় যা অন্যথায় অ্যাক্সেসরগুলি পড়া বা লেখক কিনা তা নির্ভর করে বাহ্যিক লোকদের প্রবেশ করতে দেয় না।
শ্রেণীর ভিতরে থাকা অবজেক্টগুলি একে অপরকে সহজেই অ্যাক্সেস করতে পারে
ক্লাসগুলি এবং সেগুলির মধ্যে ভেরিয়েবল, বৈশিষ্ট্য এবং পদ্ধতিগুলি অ্যাক্সেস করার আপনার ক্ষমতা সহ ঠিক একই জিনিস। আছে HTH! কোন প্রশ্ন, দয়া করে জিজ্ঞাসা করুন এবং আমি আশা করি আমি স্পষ্ট করতে পারেন।
আপনি যদি ওওপি ধারণার সাথে পরিচিত হন তবে আপনাকে অবশ্যই গিটার এবং সেটার পদ্ধতির সাথে পরিচিত হতে হবে। আতির_একসেসর রুবিতেও একই কাজ করে।
জেনারেট ওয়ে ইন গেটর এবং সেটার
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"
আমিও এই সমস্যার মুখোমুখি হয়েছি এবং এই প্রশ্নের কিছুটা দীর্ঘ উত্তর লিখেছি। ইতিমধ্যে এটি সম্পর্কে কিছু দুর্দান্ত উত্তর রয়েছে, তবে যে কেউ আরও স্পষ্টতা খুঁজছেন, আমি আশা করি আমার উত্তরটি সহায়তা করতে পারে
পদ্ধতিটি আরম্ভ করুন
ইনিশিয়েল করা আপনাকে ক্লাসের নতুন ইভেন্ট তৈরির সময় আপনার কোডের একটি পৃথক লাইনে সেট করার চেয়ে উদাহরণ তৈরি করার সময় কোনও অবজেক্টের উদাহরণে ডেটা সেট করার অনুমতি দেয়।
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 উভয়ের ফাংশন সম্পাদন করে।
আমি মনে করি যে নতুন রুবিবাদক / প্রোগ্রামারগুলিকে (আমার মতো) গুলিয়ে দেয় তার একটি অংশ:
"আমি কেন এটির কোনও নির্দিষ্ট বৈশিষ্ট্য (উদাহরণস্বরূপ, নাম) উদাহরণটি বলতে পারি না এবং সেই বৈশিষ্ট্যটির সমস্ত মূল্যকে এক ঝাঁকুনিতে দিতে পারি?"
আরও কিছুটা সাধারণীকরণ করা হয়েছে, তবে এটি আমার জন্য কীভাবে ক্লিক করেছে:
প্রদত্ত:
class Person
end
আমরা ব্যক্তিটিকে এমন কিছু হিসাবে সংজ্ঞায়িত করি নি যেটির পক্ষে নাম বা অন্য কোনও বৈশিষ্ট্য থাকতে পারে।
সুতরাং আমরা যদি তারপর:
baby = Person.new
... এবং তাদের একটি নাম দেওয়ার চেষ্টা করুন ...
baby.name = "Ruth"
আমরা একটি ত্রুটি পেয়েছি কারণ, রুবিল্যান্ডে, একটি ব্যক্তি শ্রেণীর অবজেক্ট এমন কিছু নয় যা "নাম" রাখার সাথে সম্পর্কিত বা সক্ষম ... তবে এখনও!
তবে আমরা প্রদত্ত যে কোনও পদ্ধতি ব্যবহার করতে পারি (পূর্ববর্তী উত্তরগুলি দেখুন) বলার উপায় হিসাবে, "একজন ব্যক্তি শ্রেণীর উদাহরণ ( baby
) এখন 'নাম' নামে একটি বৈশিষ্ট্যযুক্ত থাকতে পারে , তাই আমাদের কেবল না পাওয়ার একটি সিনট্যাক্টিকাল উপায় রয়েছে এবং নামটি সেট করা, তবে এটি করা আমাদের পক্ষে বোধগম্য। "
আবার, এই প্রশ্নটি কিছুটা আলাদা এবং আরও সাধারণ কোণ থেকে আঘাত করা, তবে আমি আশা করি এটি পরবর্তী শ্রেণীর ব্যক্তি যারা এই থ্রেডে তাদের পথ খুঁজে পায় তাদের সহায়তা করে।
সহজভাবে এটি বর্গের জন্য একটি সেটার এবং গেটর সংজ্ঞায়িত করবে।
মনে রাখবেন যে
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
শ্রেণীর জন্য একটি সেটার এবং গেটর সংজ্ঞায়নের সমতুল্য।
এটি বোঝার আরেকটি উপায় হ'ল এটি কী ত্রুটি কোডটি রয়েছে তা দ্বারা নির্মূল করে 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 নাম, একটি দৃষ্টান্ত ভেরিয়েবল (@ নাম) তৈরি করে এটি পড়ার জন্য একটি সম্পর্কিত অ্যাক্সেস পদ্ধতি। বৈশিষ্ট্য নির্ধারণ করতে নাম = নামে একটি পদ্ধতিও তৈরি করে।
module Mod
attr_accessor(:one, :two)
end
Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
একটি অ্যাট্রিবিউট অ্যাকসেসর ওরফে অ্যাটর_একসেসর সংক্ষিপ্ত করতে আপনাকে দুটি বিনামূল্যে পদ্ধতি দেয়।
জাভা এর মতো তারা গেটারস এবং সেটটার নামে ডাকে।
অনেক উত্তর ভাল উদাহরণ দেখিয়েছে তাই আমি কেবল সংক্ষিপ্ত হতে চলেছি।
#the_attribute
এবং
# The_attribute =
পুরানো রুবি ডক্সে একটি হ্যাশ ট্যাগ # এর অর্থ একটি পদ্ধতি। এটিতে একটি শ্রেণীর নামের উপসর্গও অন্তর্ভুক্ত থাকতে পারে ... মাই ক্লাস # মাই_মোথডো
আমি রুবিতে নতুন এবং কেবল নিম্নলিখিত অদ্ভুততা বোঝার সাথে মোকাবিলা করতে হয়েছিল। ভবিষ্যতে অন্য কাউকে সাহায্য করতে পারে। শেষ পর্যন্ত এটি উপরে উল্লিখিত হিসাবে রয়েছে, যেখানে 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
বৈশিষ্ট্যগুলি এমন শ্রেণীবদ্ধ উপাদান যা অবজেক্টের বাইরে থেকে অ্যাক্সেস করা যায়। তারা অন্যান্য অনেক প্রোগ্রামিং ভাষায় সম্পত্তি হিসাবে পরিচিত। অবজেক্ট_নেম.অ্যাট্রিবিউট_নেম হিসাবে "ডট নোটেশন" ব্যবহার করে তাদের মানগুলি অ্যাক্সেসযোগ্য। পাইথন এবং কয়েকটি অন্যান্য ভাষার মতো নয়, রুবি বস্তুর বাইরে থেকে সরাসরি উদাহরণের ভেরিয়েবলগুলি অ্যাক্সেস করার অনুমতি দেয় না।
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
প্রথম (দীর্ঘতর) উদাহরণ, যা রুবির অন্তর্নির্মিত পদ্ধতিগুলিকে নিয়োগ করে না, কেবল তখনই যখন ব্যবহারকারীর এবং সেটটার পদ্ধতিতে অতিরিক্ত কোড প্রয়োজন হয় তখন ব্যবহার করা উচিত। উদাহরণস্বরূপ, একটি সেটার পদ্ধতির কোনও উদাহরণ ভেরিয়েবলের মান নির্ধারণের আগে ডেটা বৈধকরণের বা কিছু গণনা করার প্রয়োজন হতে পারে।
উদাহরণ_ভ্যারেবল_জেট এবং দৃষ্টান্ত পরিবর্তনযোগ্য_সেট অন্তর্নির্মিত পদ্ধতিগুলি ব্যবহার করে অবজেক্টের বাইরে থেকে উদাহরণের ভেরিয়েবলগুলি অ্যাক্সেস (পঠন এবং লিখন) পাওয়া সম্ভব। যাইহোক, এটি খুব কমই ন্যায়সঙ্গত এবং সাধারণত একটি খারাপ ধারণা, কারণ এনক্যাপসুলেশনকে বাইপাস করা সমস্ত ধরণের সর্বনাশকে নষ্ট করে।
হুম। প্রচুর ভাল উত্তর। এটিতে আমার কয়েকটি সেন্ট রয়েছে।
attr_accessor
এটি একটি সহজ পদ্ধতি যা পুনরাবৃত্তি করার পদ্ধতিগুলি পরিষ্কার করতে ( DRY-ING ) আমাদের সহায়তা করে ।getter and setter
যাতে আমরা ব্যবসায়ের যুক্তি লেখায় আরও ফোকাস করতে পারি এবং সেটার এবং গেটারদের নিয়ে চিন্তা না করে।
অন্যগুলির চেয়ে অ্যাটর_সেসসারের মূল কার্যকারিতা হ'ল অন্যান্য ফাইল থেকে ডেটা অ্যাক্সেস করার ক্ষমতা।
সুতরাং আপনার কাছে সাধারণত অ্যাট্রি_ড্রেডার বা অ্যাটর_উইটার থাকে তবে সুসংবাদটি হ'ল রুবি আপনাকে এই দু'টিকে একত্রে_অ্যাক্সেসরের সাথে একত্রিত করতে দেয়। আমি এটি হিসাবে মনে করি আমার যাওয়ার পদ্ধতিকারণ এটি আরও ভাল গোলাকার বা বহুমুখী। এছাড়াও, মনে রাখবেন যে জেলগুলিতে, এটি নির্মূল হয় কারণ এটি এটি আপনার শেষ প্রান্তে করে। সুতরাং অন্য কথায়: আপনি অন্য দু'টির তুলনায় অ্যাট্রি_সেসর ব্যবহার করা ভাল better কারণ আপনার নির্দিষ্ট হওয়ার বিষয়ে চিন্তা করার দরকার নেই, অ্যাক্সেসরটি এটিকে সমস্ত .েকে রাখে। আমি জানি এটি আরও সাধারণ ব্যাখ্যা তবে এটি আমাকে শিক্ষানবিশ হিসাবে সহায়তা করেছিল।
আশা করি এটি সাহায্য করেছে!