2010-02-24 15 views
30

मेरे पास कुछ सदस्य चर के साथ कक्षा फू है। जब कक्षा के दो उदाहरणों में सभी मूल्य बराबर होते हैं, तो मैं वस्तुओं को 'बराबर' होना चाहता हूं। मैं इन वस्तुओं को अपने हैश में चाबियाँ पसंद करूंगा। जब मैं वर्तमान में यह कोशिश करता हूं, हैश प्रत्येक उदाहरण को असमान मानता है।रूबी में ऑब्जेक्ट उदाहरण को हैश कुंजी कैसे बनाएं?

h = {} 
f1 = Foo.new(a,b) 
f2 = Foo.new(a,b) 

f1 और f2 इस बिंदु पर बराबर होना चाहिए।

h[f1] = 7 
h[f2] = 8 
puts h[f1] 

प्रिंट चाहिए 8

उत्तर

54

देखें http://ruby-doc.org/core/classes/Hash.html

हैश key.eql का उपयोग करता है? समानता के लिए कुंजी का परीक्षण करने के लिए। यदि आप एक हैश में कुंजी के रूप में उपयोग करने के लिए अपने स्वयं के उदाहरणों वर्गों के की जरूरत है, यह अनुशंसित है कि आप दोनों eql को परिभाषित? और हैश विधियों। हैश विधि संपत्ति है कि a.eql? (ख) का तात्पर्य a.hash == b.hash होना आवश्यक है।

eql? विधि लागू करने में आसान है: यदि सभी सदस्य चर समान हैं तो सत्य वापस आएं। हैश विधि के लिए, [@ data1, @ data2] का उपयोग करें। क्योंकि मार्क-आंद्रे टिप्पणियों में सुझाव देता है।

+0

बिल्कुल सही स्पष्टीकरण। =) – Mereghost

+8

अच्छा, सिवाय इसके कि हैश को फिक्सनम होना चाहिए, इसलिए बेहतर उपयोग करें या योग के बजाय (जो एक बिग्नम पर बह सकता है)। वैकल्पिक रूप से, 'ऐरे # हैश' का उपयोग करें, जैसे' [@ data1, @ data2] .hash', कहें। –

+0

अच्छा बिंदु। अलग-अलग हैंश जोड़ना भी खतरे में है कि एक ही राशि अलग-अलग व्यक्तिगत हैंश (3 + 2 = 5 और 1 + 4 = 5) से हो सकती है। मार्क-हैश के रूप में ऐरे # हैश का उपयोग करने से पता चलता है कि समाधान अधिक पूर्ण हो जाएगा। – Mark

-3

को अपनी कक्षा में एक विधि 'हैश' नामक जोड़ें:

class Foo 
    def hash 
    return whatever_munge_of_instance_variables_you_like 
    end 
end 

इस तरह से आप का अनुरोध किया काम करेंगे और अलग है, लेकिन समान, वस्तुओं के लिए अलग हैश कुंजी उत्पन्न नहीं होंगे।

+4

तुम भी eql? एक तरीका है कि हैश विधि के अनुरूप में विधि परिभाषित करना चाहिए। इसके अलावा, हैश विधि एक Fixnum लौटना चाहिए, या कहीं भी होगी uniq तोड़ो। – ChrisPhoenix

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