2010-08-02 25 views
9

जावा में, == समानता का सबसे मजबूत प्रकार है (पॉइंटर समानता): a == b हमेशा a.equals(b) का तात्पर्य है। हालांकि, रूबी में, ==.equals? की तुलना में कमजोर है:रुबी में == क्या करता है?

ruby-1.9.2-rc2 > 17 == 17.0 
=> true 
ruby-1.9.2-rc2 > 17.equal?(17.0) 
=> false 

तो, मैं कहाँ == के बारे में अधिक सीख सकते हैं? जब मैं दो वस्तुओं की तुलना करता हूं तो मुझे किस प्रकार की जांच की उम्मीद करनी चाहिए?

== तुलना जाँच करता है कि दो मान बराबर

eql? जांच करता है कि दो मान समान और एक ही प्रकार के

equal? जांच करता है कि दो हैं:

उत्तर

8

इस संक्षिप्त क्या आप को पता है की जरूरत है चीजें एक और एक ही वस्तु हैं।

इस बारे में एक अच्छा ब्लॉग here है।

+2

ऐसा लगता है कि वे eql के लिए बेहतर विधि नाम चुन सकते थे? और बराबर? –

+1

सीएलआईएसपी खराब है: 'eq',' eql', 'बराबर',' बराबर ', और '='। बेहतर नामित ऑपरेटर जैसे 'स्ट्रिंग-बराबर' और 'पेड़-बराबर' हैं। –

+0

ठीक है, इसलिए मुझे दो वस्तुओं की तुलना करने के लिए कभी भी '==' का उपयोग नहीं करना चाहिए? लेकिन रुबी में भी '5' एक वस्तु है ... तो तुलना करने के लिए' ==' का उपयोग करना सुरक्षित क्यों है? स्ट्रिंग्स और संख्या, निश्चित रूप से। सरणी के बारे में क्या? हैश? –

1

वास्तविकता में वे दोनों ही तरीके हैं == मतलब ऑब्जेक्ट। == (अन्य_बोजेक्ट) बराबर है? object.equals? (Other_object)

का मतलब है इस मामले में, हालांकि, बराबर मूल रूप से हैश देखने की तुलना के लिए प्रयोग किया जाता है यानी a_hash [1] नहीं a_hash [1.0]

रूप में एक ही कुंजी मान युग्म होना चाहिए

एचटीएच। -r

0
jruby-1.5.0 > 17 ==17 
=> true 
jruby-1.5.0 > 17 == 17.0 
=> true 
jruby-1.5.0 > 17 === 17.0 
=> true 
jruby-1.5.0 > 17.equal?(17.0) 
=> false 
jruby-1.5.0 > 17.id 
=> 35 
jruby-1.5.0 > (17.0).id 
(irb):12 warning: Object#id will be deprecated; use Object#object_id 
=> 2114 

रूबी में सबकुछ एक वस्तु है। ऑब्जेक्ट 17 17.0 और बराबर के समान वस्तु नहीं है? वस्तुओं की तुलना करता है, वस्तुओं के मूल्य नहीं।

1

==, बस, एक विधि है। मुझे लगता है कि यह वास्तव में अच्छी तरह से here समझाया गया है:

आमतौर पर, इस विधि वंशज कक्षाओं में ओवरराइड की गई है वर्ग-विशेष अर्थ प्रदान करते हैं।

Numeric के साथ एक उदाहरण के साथ

, एक ख़तरा यहाँ नहीं है, हालांकि: के रूप में == बाईं संकार्य की एक विधि है, है ना हमेशा सुरक्षित माना कि a==b का परिणाम b==a के रूप में एक ही होना चाहिए। विशेष रूप से मामलों में जब a एक विधि कॉल है, जो रूबी जैसे गतिशील भाषा में, हमेशा उसी प्रकार के मान वापस नहीं करना चाहिए।

संबंधित मुद्दे