'<<' एक साधारण विधि के रूप में
ज्यादातर मामलों में '<<' बाकी की तरह परिभाषित की गई विधि है, आपके मामले में इसका मतलब है "इस सरणी के अंत में जोड़ें" ( यहां भी देखें )।
यह आपके विशेष मामले में है, लेकिन कई अन्य अवसर भी हैं जहां आप "<<" विधि का सामना करेंगे। मैं इसे 'ऑपरेटर' नहीं कहूंगा क्योंकि यह वास्तव में एक ऐसी विधि है जो किसी वस्तु पर परिभाषित है जिसे आपके द्वारा ओवरराइड किया जा सकता है या अपनी खुद की वस्तुओं के लिए कार्यान्वित किया जा सकता है। '<<' के अन्य मामले
- स्ट्रिंग संघनन: "a" << "b"
- IO को आउटपुट लिखना: io << "टेक्स्ट की एक पंक्ति \ n"
- संदेश को पचाने के लिए डेटा लिखना, HMAC या सिफर: sha << "टेक्स्ट टू हैशेड"
- एक ओपनएसएसएल के बाएं-स्थानांतरण :: बीएन: बीएन << 2
- ...
सिंगलटन वर्ग परिभाषा;
फिर कार्यक्रम प्रवाह के भीतर वर्तमान स्कोप (= स्वयं का परिवर्तन) की रहस्यमय पारी है:
class A
class << self
puts self
end
end
a = A.new
class << a
puts self
end
रहस्य class << self
ने मुझे आश्चर्यचकित कर दिया और वहां के आंतरिक लोगों के बारे में जांच की। जबकि मेरे द्वारा बताए गए सभी उदाहरणों <<
में वास्तव में एक वर्ग में परिभाषित एक विधि है, अर्थात
obj << stuff
के बराबर है
obj.<<(stuff)
class << self
निर्माण (या किसी भी स्वयं के स्थान पर वस्तु) को सही मायने में अलग है। यह वास्तव में ही भाषा, CRuby में उस में परिभाषित किया है की अंतर्निहित सुविधा है parse.y के रूप में
k_class tLSHFT expr
जहाँ tLSHFT एक '<<' टोकन है, k_class 'क्लास' कीवर्ड है और expr एक मनमाना अभिव्यक्ति है। यही है, आप वास्तव में लिख सकते हैं
class << <any expression>
और अभिव्यक्ति के परिणाम के सिंगलटन वर्ग में 'स्थानांतरित' हो जाएगा। TLSHFT अनुक्रम को 'NODE_SCLASS' अभिव्यक्ति के रूप में पार्स किया जाएगा, जिसे एक सिंगलटन क्लास परिभाषा (cf. node.c) कहा जाता है
case NODE_SCLASS:
ANN("singleton class definition");
ANN("format: class << [nd_recv]; [nd_body]; end");
ANN("example: class << obj; ..; end");
F_NODE(nd_recv, "receiver");
LAST_NODE;
F_NODE(nd_body, "singleton class definition");
break;
यहाँ दस्तावेज़
और, मैं उन लोगों को कैसे भूल सकता हूं, यहां दस्तावेज़ '<<' का एक तरह से उपयोग करते हैं जो फिर से पूरी तरह से अलग है। आप एक स्ट्रिंग को परिभाषित कर सकते हैं जो आसानी से घोषित करके कई लाइनों पर फैल जाती है
here_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_
'यहाँ डॉक्टर ऑपरेटर' को भेद करने के लिए एक मनमाने ढंग से स्ट्रिंग सीमांकक को तुरंत '<<' का पालन करना होगा। सब कुछ उस प्रारंभिक सीमांकक और उसी परिसीमन की दूसरी घटना अंतिम स्ट्रिंग का हिस्सा होगा। '<< -' का उपयोग करना भी संभव है, अंतर यह है कि उत्तरार्द्ध का उपयोग किसी भी अग्रणी या अनुगामी व्हाट्सएप की उपेक्षा करेगा।