class << self
ক্লাসের পদ্ধতিগুলি ঘোষণা করার উপায় ছাড়াও এটি (যদিও এটি সেভাবে ব্যবহার করা যেতে পারে)। সম্ভবত আপনি কিছু ব্যবহার দেখেছেন:
class Foo
class << self
def a
print "I could also have been defined as def Foo.a."
end
end
end
এটি কাজ করে, এবং এর সমতুল্য def Foo.a
, তবে এটি যেভাবে কাজ করে তা সামান্য সূক্ষ্ম। রহস্যটি হ'ল self
, সেই প্রসঙ্গে, সেই বস্তুকে বোঝায় Foo
, যার শ্রেণি একটি অনন্য, বেনাম সাবক্লাস Class
। এই সাবক্লাসকে বলা হয় Foo
' আইজেনক্লাস ' । তাই def a
নতুন পদ্ধতি নামক সৃষ্টি a
মধ্যে Foo
, স্বাভাবিক পদ্ধতি কল সিনট্যাক্স দ্বারা অ্যাক্সেসযোগ্য এর eigenclass: Foo.a
।
এখন অন্য একটি উদাহরণ তাকান:
str = "abc"
other_str = "def"
class << str
def frob
return self + "d"
end
end
print str.frob
print other_str.frob
এই উদাহরণটি সর্বশেষের মতোই, যদিও প্রথমে বলা শক্ত হতে পারে। frob
সংজ্ঞায়িত করা হয়, String
ক্লাসে নয়, এর আইজেনচ্লাসে str
, একটি অনন্য বেনামে সাবক্লাস String
। সুতরাং str
একটি frob
পদ্ধতি আছে, কিন্তু উদাহরণস্বরূপ String
না। আমাদের কাছে স্ট্রিংয়ের ওভাররাইড পদ্ধতিগুলিও থাকতে পারে (কিছু নির্দিষ্ট টেস্টিং পরিস্থিতিতে খুব দরকারী)।
এখন আমরা আপনার আসল উদাহরণটি বোঝার জন্য সজ্জিত। ইনসাইড Foo
'র আরম্ভ পদ্ধতি, self
ক্লাসে না বোঝায় Foo
, কিন্তু কিছু বিশেষ করার উদাহরণ হিসেবে বলা যায় এর Foo
। এর আইজেনচ্লাসটি একটি সাবক্লাস Foo
, তবে এটি নয় Foo
; এটি হতে পারে না, নাহলে দ্বিতীয় কৌশলটিতে আমরা যে কৌশলটি দেখেছি তা কাজ করতে পারে না। সুতরাং আপনার উদাহরণ চালিয়ে যেতে:
f1 = Foo.new(:weasels)
f2 = Foo.new(:monkeys)
f1.weasels = 4
f2.monkeys = 5
print(f1.monkeys)
আশাকরি এটা সাহায্য করবে.