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