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है :।FooFoo.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)
उम्मीद है की यह मदद करेगा।