উত্তর:
লেখা @age
সরাসরি উদাহরণের পরিবর্তনশীল অ্যাক্সেস করে @age
। লিখনটি self.age
নিজেকে বার্তা প্রেরণে অবজেক্টকে বলে age
, যা সাধারণত উদাহরণটি পরিবর্তনশীল ফিরিয়ে দেয় @age
- তবে age
প্রদত্ত সাবক্লাসে পদ্ধতিটি কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করে অন্যান্য অনেকগুলি কাজ করতে পারে । উদাহরণস্বরূপ, আপনার কাছে একটি মিডলএজডসোসালাইট ক্লাস থাকতে পারে যা সর্বদা তার বয়সটিকে তার চেয়ে 10 বছর কম বয়সে প্রতিবেদন করে। বা আরও ব্যবহারিকভাবে, একটি পার্সিস্ট্যান্ট পার্সন ক্লাস অবিরাম স্টোর থেকে অলসভাবে সেই ডেটাটি পড়তে পারে, তার সমস্ত অবিরাম ডেটা একটি হ্যাশে ক্যাশে করে।
পার্থক্যটি হ'ল এটি এর প্রয়োগ থেকে পদ্ধতির ব্যবহারকে বিচ্ছিন্ন করে দিচ্ছে। যদি সম্পত্তিটির বাস্তবায়ন পরিবর্তন করতে হয় - জন্ম তারিখ রাখতে বলুন এবং তারপরে এখন এবং জন্ম তারিখের মধ্যে সময়ের পার্থক্যের ভিত্তিতে বয়স গণনা করুন - তবে পদ্ধতির উপর নির্ভর করে কোডটি পরিবর্তনের দরকার নেই। যদি এটি সম্পত্তি সরাসরি ব্যবহার করে, তবে পরিবর্তনের কোডের অন্যান্য ক্ষেত্রে প্রচার করা দরকার। এই অর্থে, সম্পত্তিটিকে শ্রেণিবদ্ধ ইন্টারফেস ব্যবহারের চেয়ে সরাসরি সম্পত্তি ব্যবহার করা ভঙ্গুর।
সতর্কতা অবলম্বন করুন যখন আপনি এমন কোনও শ্রেণীর উত্তরাধিকারী হন Struct.new
যা থেকে ইনটালাইজার তৈরি করার ঝরঝরে উপায় (রুবিতে কীভাবে প্রারম্ভক সরঞ্জাম তৈরি করবেন? )
class Node < Struct.new(:value)
def initialize(value)
@value = value
end
def show()
p @value
p self.value # or `p value`
end
end
n = Node.new(30)
n.show()
ফিরে আসবে
30
nil
তবে আপনি যখন আরম্ভকারীটি সরিয়ে ফেলবেন তখন তা ফিরে আসবে
nil
30
ক্লাস সংজ্ঞা সহ
class Node2
attr_accessor :value
def initialize(value)
@value = value
end
def show()
p @value
p self.value
end
end
আপনার কনস্ট্রাক্টর সরবরাহ করা উচিত।
n2 = Node2.new(30)
n2.show()
ফিরে আসবে
30
30
প্রথম উত্তরটি পুরোপুরি সঠিক, তবে আপেক্ষিক নবাগত হিসাবে এটি আমার দ্বারা কী বোঝানো হয়েছিল তা তাত্ক্ষণিকভাবে আমার কাছে পরিষ্কার হয়ে যায়নি (স্ব-বার্তাগুলি প্রেরণ করছেন? আহহহ ...)। আমি মনে করি যে একটি সংক্ষিপ্ত উদাহরণ সাহায্য করবে:
class CrazyAccessors
def bar=(val)
@bar = val - 20 # sets @bar to (input - 20)
end
def bar
@bar
end
def baz=(value)
self.bar = value # goes through `bar=` method, so @bar = (50 - 20)
end
def quux=(value)
@bar = value # sets @bar directly to 50
end
end
obj = CrazyAccessors.new
obj.baz = 50
obj.bar # => 30
obj.quux = 50
obj.bar # => 50
কোন পার্থক্য নেই। আমার সন্দেহ হয় যে এটি কেবল একে অপরকে দেখার self.age
ও other_person.age
কাছাকাছি করার ডকুমেন্টারি মানের জন্য করা হয়েছিল ।
আমি মনে করি যে ব্যবহারটি ভবিষ্যতে একটি প্রকৃত প্রাপ্তি লেখার অনুমতি দেয়, যা কেবলমাত্র একটি উদাহরণ পরিবর্তনশীল ফিরিয়ে দেওয়ার চেয়ে আরও জটিল কিছু করতে পারে এবং সেই ক্ষেত্রে পদ্ধতিটি পরিবর্তনের প্রয়োজন হবে না।
তবে এটি নিয়ে উদ্বেগের এক অসম্ভব বিমূর্ততা, সর্বোপরি, যদি অবজেক্টের প্রয়োগটি পরিবর্তিত হয় তবে অন্য পদ্ধতিগুলি পরিবর্তন করা যুক্তিসঙ্গত, কোনও এককালে অবজেক্টের মধ্যে একটি সাধারণ রেফারেন্স পুরোপুরি যুক্তিসঙ্গত।
যে কোনও ক্ষেত্রে, age
সম্পত্তির বিমূর্ততা এখনও স্পষ্টভাবে এর ব্যাখ্যার ব্যাখ্যা দেয় না self
, যেমন সহজ সরল age
এছাড়াও অ্যাক্সেসরকে অনুরোধ করেছিল।
@age - অবশ্যই উদাহরণ পরিবর্তনশীল বয়স
self.age - উদাহরণ সম্পত্তি বয়স বোঝায়।