समानता ऑपरेटरों: == और! =
== ऑपरेटर, जिसे समानता या डबल बराबर के रूप में भी जाना जाता है, दोनों वस्तुओं के समान और झूठे होने पर सही वापस आ जाएंगे यदि वे नहीं हैं।
"koan" == "koan" # Output: => true
= = ऑपरेटर, जिसे असमानता के रूप में भी जाना जाता है, == के विपरीत है। यह सच है कि अगर दोनों वस्तुएं समान नहीं हैं और झूठे हैं तो वे समान होंगे।
"koan" != "discursive thought" # Output: => true
ध्यान दें कि एक अलग क्रम में समान तत्वों वाले दो सरणियाँ समान नहीं हैं, एक ही अक्षर के अपरकेस और लोअरकेस संस्करण समान नहीं हैं और इसी तरह।
विभिन्न प्रकारों (जैसे, पूर्णांक और फ्लोट) की संख्या की तुलना करते समय, यदि उनका संख्यात्मक मान समान है, तो == सही वापस आएगा।
2 == 2.0 # Output: => true
बराबरी का?
== ऑपरेटर के विपरीत जो परीक्षण करता है यदि दोनों ऑपरेंड समान हैं, तो समान विधि यह जांचती है कि क्या दोनों ऑपरेंड एक ही ऑब्जेक्ट को संदर्भित करते हैं। यह रूबी में समानता का सबसे सख्त रूप है।
उदाहरण: a = "ज़ेन" बी = "ज़ेन"
a.object_id # Output: => 20139460
b.object_id # Output :=> 19972120
a.equal? b # Output: => false
ऊपर के उदाहरण में, हमारे पास समान मूल्य के साथ दो तार हैं। हालांकि, वे दो अलग-अलग ऑब्जेक्ट हैं, अलग-अलग ऑब्जेक्ट आईडी के साथ। इसलिए, बराबर? विधि झूठी आएगी।
चलिए फिर से कोशिश करते हैं, केवल इस बार b a का संदर्भ होगा। ध्यान दें कि ऑब्जेक्ट ID दोनों वेरिएबल्स के लिए समान है, क्योंकि वे एक ही ऑब्जेक्ट को इंगित करते हैं।
a = "zen"
b = a
a.object_id # Output: => 18637360
b.object_id # Output: => 18637360
a.equal? b # Output: => true
eql?
हैश क्लास में, इकला? विधि यह समानता के लिए कुंजी का परीक्षण करने के लिए प्रयोग किया जाता है। इसे समझाने के लिए कुछ पृष्ठभूमि की आवश्यकता होती है। कंप्यूटिंग के सामान्य संदर्भ में, एक हैश फ़ंक्शन किसी भी आकार की एक स्ट्रिंग (या फ़ाइल) लेता है और निश्चित आकार का एक स्ट्रिंग या पूर्णांक बनाता है जिसे हैशकोड कहा जाता है, जिसे आमतौर पर केवल हैश के रूप में संदर्भित किया जाता है। कुछ आमतौर पर उपयोग किए जाने वाले हैशकोड प्रकार MD5, SHA-1 और CRC हैं। इनका उपयोग एन्क्रिप्शन एल्गोरिदम, डेटाबेस इंडेक्सिंग, फ़ाइल अखंडता जाँच आदि में किया जाता है। कुछ प्रोग्रामिंग भाषाएं, जैसे रूबी, एक संग्रह प्रकार प्रदान करती हैं जिसे हैश टेबल कहा जाता है। हैश टेबल डिक्शनरी जैसे संग्रह हैं जो जोड़े में डेटा संग्रहीत करते हैं, जिसमें अद्वितीय कुंजी और उनके संबंधित मूल्य शामिल हैं। हुड के तहत, उन कुंजियों को हैशकोड के रूप में संग्रहीत किया जाता है। हैश टेबल को आमतौर पर सिर्फ हैश के रूप में संदर्भित किया जाता है। ध्यान दें कि हैशकेन शब्द हैशकोड या हैश टेबल को कैसे संदर्भित करता है।
रूबी हैशकोड बनाने के लिए हैश नामक एक बिल्ट-इन विधि प्रदान करता है। नीचे दिए गए उदाहरण में, यह एक स्ट्रिंग लेता है और एक हैशकोड लौटाता है। ध्यान दें कि समान मान वाले स्ट्रिंग्स में हमेशा समान हैशकोड होते हैं, भले ही वे अलग-अलग ऑब्जेक्ट (अलग ऑब्जेक्ट आईडी के साथ) हों।
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
हैश विधि को कर्नेल मॉड्यूल में लागू किया गया है, जो ऑब्जेक्ट क्लास में शामिल है, जो सभी रूबी ऑब्जेक्ट्स का डिफ़ॉल्ट रूट है। कुछ वर्ग जैसे कि प्रतीक और पूर्णांक डिफ़ॉल्ट कार्यान्वयन का उपयोग करते हैं, अन्य लोग जैसे स्ट्रिंग और हैश अपने स्वयं के कार्यान्वयन प्रदान करते हैं।
Symbol.instance_method(:hash).owner # Output: => Kernel
Integer.instance_method(:hash).owner # Output: => Kernel
String.instance_method(:hash).owner # Output: => String
Hash.instance_method(:hash).owner # Output: => Hash
रूबी में, जब हम किसी हैश (संग्रह) में कुछ संग्रहीत करते हैं, तो एक कुंजी (जैसे, स्ट्रिंग या प्रतीक) के रूप में प्रदान की गई वस्तु को हैशकोड के रूप में परिवर्तित और संग्रहीत किया जाता है। बाद में, हैश (संग्रह) से एक तत्व प्राप्त करते समय, हम एक कुंजी के रूप में एक वस्तु प्रदान करते हैं, जिसे हैशकोड में बदल दिया जाता है और मौजूदा कुंजी की तुलना में। यदि कोई मेल है, तो संबंधित आइटम का मान लौटाया जाता है। Eql का उपयोग करके तुलना की जाती है? हुड के तहत विधि।
"zen".eql? "zen" # Output: => true
# is the same as
"zen".hash == "zen".hash # Output: => true
ज्यादातर मामलों में, eql? विधि == विधि के समान व्यवहार करती है। हालाँकि, कुछ अपवाद हैं। उदाहरण के लिए, eql? जब एक पूर्णांक की तुलना एक फ्लोट से करते हैं तो निहित प्रकार रूपांतरण नहीं करते हैं।
2 == 2.0 # Output: => true
2.eql? 2.0 # Output: => false
2.hash == 2.0.hash # Output: => false
मामला समानता ऑपरेटर: ===
रूबी की कई अंतर्निहित कक्षाएं, जैसे स्ट्रिंग, रेंज, और रेगेक्सपी, === ऑपरेटर के अपने स्वयं के कार्यान्वयन प्रदान करती हैं, जिन्हें केस-समानता, ट्रिपल इक्वल या थ्रीक्वल्स के रूप में भी जाना जाता है। क्योंकि यह प्रत्येक वर्ग में अलग तरह से लागू किया जाता है, इसलिए इसे जिस प्रकार की वस्तु पर बुलाया गया था, उसके आधार पर यह अलग तरह से व्यवहार करेगा। आम तौर पर, यह सच है कि यदि दाईं ओर की वस्तु "बाईं ओर है" या "बाईं तरफ की वस्तु" का सदस्य है। उदाहरण के लिए, इसका उपयोग यह जांचने के लिए किया जा सकता है कि कोई वस्तु किसी वर्ग (या उसके किसी उपवर्ग) का उदाहरण है या नहीं।
String === "zen" # Output: => true
Range === (1..2) # Output: => true
Array === [1,2,3] # Output: => true
Integer === 2 # Output: => true
वही परिणाम अन्य तरीकों से प्राप्त किया जा सकता है जो संभवतः नौकरी के लिए सबसे उपयुक्त हैं। आमतौर पर कोड लिखना बेहतर होता है जो दक्षता और संक्षिप्तता का त्याग किए बिना जितना संभव हो उतना स्पष्ट होकर पढ़ना आसान है।
2.is_a? Integer # Output: => true
2.kind_of? Integer # Output: => true
2.instance_of? Integer # Output: => false
ध्यान दें कि अंतिम उदाहरण गलत है, क्योंकि पूर्णांक 2 फिक्सनम वर्ग के उदाहरण हैं, जो इंटेक्स वर्ग का एक उपवर्ग है। ===, is_a? और inst_of? यदि ऑब्जेक्ट दिए गए वर्ग या किसी उपवर्ग का एक उदाहरण है, तो तरीके सही हैं। Inst_of पद्धति कठोर है और केवल तभी सही है जब ऑब्जेक्ट उस सटीक वर्ग का उदाहरण है, न कि उपवर्ग।
Is_a और kind_of? तरीकों को कर्नेल मॉड्यूल में लागू किया जाता है, जिसे ऑब्जेक्ट क्लास द्वारा मिलाया जाता है। दोनों एक ही विधि के लिए उपनाम हैं। आइए सत्यापित करें:
कर्नेल.instance_method (: kind_of?) == कर्नेल.instance_method ((is_a?) # आउटपुट: => सत्य
श्रेणी = = का कार्यान्वयन
जब === ऑपरेटर को रेंज ऑब्जेक्ट पर बुलाया जाता है, तो यह सही होता है यदि दाईं ओर का मूल्य बाईं ओर की सीमा के भीतर आता है।
(1..4) === 3 # Output: => true
(1..4) === 2.345 # Output: => true
(1..4) === 6 # Output: => false
("a".."d") === "c" # Output: => true
("a".."d") === "e" # Output: => false
याद रखें कि === ऑपरेटर बाएं हाथ की वस्तु का === तरीका बताता है। तो (१.४) === ३ (१.४) के बराबर है। === ३. दूसरे शब्दों में, बाएं हाथ के संचालन का वर्ग परिभाषित करेगा कि === विधि का कार्यान्वयन कौन सा होगा कहा जाता है, तो ऑपरेंड की स्थिति विनिमेय नहीं है।
Regexp का कार्यान्वयन ===
सही पर लौटाता है यदि दाईं ओर का तार बाईं ओर नियमित अभिव्यक्ति से मेल खाता है। / zen / === "प्रैक्टिस ज़ज़ेन टुडे" # आउटपुट: => सच # "प्रैक्टिस ज़ज़ेन टुडे" = ~ / zen / जैसा ही है
केस / जब बयानों पर === ऑपरेटर का निहित उपयोग
इस ऑपरेटर का उपयोग हुड के तहत केस / जब बयानों के लिए भी किया जाता है। यह इसका सबसे आम उपयोग है।
minutes = 15
case minutes
when 10..20
puts "match"
else
puts "no match"
end
# Output: match
ऊपर के उदाहरण में, अगर रूबी ने दोहरे समान ऑपरेटर (==) का उपयोग किया था, तो 10..20 की सीमा को पूर्णांक के बराबर नहीं माना जाएगा जैसे कि 15. वे मेल खाते हैं क्योंकि ट्रिपल बराबर ऑपरेटर (===) है निहितार्थ सभी मामलों में / जब बयान। उपरोक्त उदाहरण में कोड इसके बराबर है:
if (10..20) === minutes
puts "match"
else
puts "no match"
end
पैटर्न मिलान ऑपरेटरों: = ~ और ~!
= ~ (बराबर-टिल्ड) और! ~ (बैंग-टिल्ड) ऑपरेटरों का उपयोग रेगेक्स पैटर्न के खिलाफ तार और प्रतीकों से मेल खाने के लिए किया जाता है।
स्ट्रिंग और प्रतीक वर्गों में = ~ विधि का कार्यान्वयन एक तर्क के रूप में एक नियमित अभिव्यक्ति (रेगेक्स क्लास का एक उदाहरण) की अपेक्षा करता है।
"practice zazen" =~ /zen/ # Output: => 11
"practice zazen" =~ /discursive thought/ # Output: => nil
:zazen =~ /zen/ # Output: => 2
:zazen =~ /discursive thought/ # Output: => nil
रेगेक्स क्लास में कार्यान्वयन एक तर्क के रूप में एक स्ट्रिंग या प्रतीक की अपेक्षा करता है।
/zen/ =~ "practice zazen" # Output: => 11
/zen/ =~ "discursive thought" # Output: => nil
सभी कार्यान्वयनों में, जब स्ट्रिंग या प्रतीक Regexp पैटर्न से मेल खाता है, तो यह एक पूर्णांक देता है जो कि मैच की स्थिति (सूचकांक) है। यदि कोई मेल नहीं है, तो यह शून्य देता है। याद रखें कि, रूबी में, कोई भी पूर्णांक मान "सत्य" है और शून्य "मिथ्या" है, इसलिए = ~ ऑपरेटर का उपयोग यदि कथन और टर्नरी ऑपरेटरों में किया जा सकता है।
puts "yes" if "zazen" =~ /zen/ # Output: => yes
"zazen" =~ /zen/?"yes":"no" # Output: => yes
यदि स्टेटमेंट्स छोटे हों तो लिखने के लिए पैटर्न-मैचिंग ऑपरेटर भी उपयोगी होते हैं। उदाहरण:
if meditation_type == "zazen" || meditation_type == "shikantaza" || meditation_type == "kinhin"
true
end
Can be rewritten as:
if meditation_type =~ /^(zazen|shikantaza|kinhin)$/
true
end
~ ~ ऑपरेटर = ~ के विपरीत है, यह सच है जब कोई मैच नहीं होता है और एक मैच होने पर झूठा होता है।
अधिक जानकारी इस ब्लॉग पोस्ट पर उपलब्ध है ।
"a" == "a"
,"a" === "a"
और"a".eql? "a"
। लेकिन यह गलत है:"a".equal? "a"
(मेरा माणिक 1.9.2-p180 है)