2012-04-14 14 views
5

Set doc के अनुसार सेट करें, सेट में तत्व eql? का उपयोग करके तुलना किए जाते हैं।कस्टम नियम

class Foo 
    attr_accessor :bar, :baz 

    def initialize(bar = 1, baz = 2) 
    @bar = bar 
    @baz = baz 
    end 

    def eql?(foo) 
    bar == foo.bar && baz == foo.baz 
    end 
end 

कंसोल में:

मैं एक वर्ग की तरह है

f1 = Foo.new 
f2 = Foo.new 
f1.eql? f2 #=> true 

लेकिन ...

s = Set.new 
s << f1 
s << f2 
s.size #=> 2 

क्योंकि f1 के बराबर होती है f2, sनहीं दोनों को शामिल करना चाहिए उनमें से।

set कस्टम नियम के साथ तत्वों को अस्वीकार कैसे करें?

उत्तर

7

डॉक्स कि आप कहने के लिए स्पष्ट रूप से (जोर मेरा) लिंक: के बाद से Set भंडारण के रूप में Hash का उपयोग करता

तत्वों में से प्रत्येक जोड़े की समानता, Object#eql?
और Object#hash के अनुसार निर्धारित होता है।

आपको लगता है कि eql? की वस्तुओं की मान देता है अपनी कक्षा में एक hash विधि जोड़ते हैं, तो यह काम करता है:

# With your current class 

f1, f2 = Foo.new, Foo.new 
p f1.eql?(f2) 
#=> true 
p f1.hash==f2.hash 
#=> false 
p Set[f1,f2].length 
#=> 2 

# Fix the problem 
class Foo 
    def hash 
    [bar,hash].hash 
    end 
end 

f1, f2 = Foo.new, Foo.new 
p f1.eql?(f2) 
#=> true 
p f1.hash==f2.hash 
#=> true 
p Set[f1,f2].length 
#=> 1 

ईमानदार मैं कैसे लिखने के लिए एक महान भावना था कभी नहीं किया है होना करने के लिए एक अच्छा कस्टम hash विधि जब एकाधिक मान शामिल होते हैं।

+0

तो मुझे क्या करना चाहिए? – apneadiving

+0

@apneadiving मेरा संपादन देखें। – Phrogz

+3

क्या आप सिर्फ '[बार, baz] .hash' का उपयोग हैश के रूप में नहीं कर सकते? –

0

रूबी प्रोग्रामिंग भाषा पुस्तक (युकिहिरो मत्सुमोतो, रुबी भाषा निर्माता द्वारा सह-लेखक) के अनुसार हैश विधि के लिए सामान्य उद्देश्य नुस्खा कुछ संख्यात्मक (17/37) स्थिरांक उपयोग शामिल है। दिए गए उदाहरण के लिए सुझाव दिया समाधान हो की तरह होगा:

def hash 
    code = 17 
    code = 37*code + @bar.hash 
    code = 37*code + @baz.hash 
    code 
end 

तो सामान्य रूप में हम "कोड = 37 * कोड + @ x.hash" हर एक महत्वपूर्ण उदाहरण चर (@x) के लिए लाइन को दोहरा रहे हैं।

+0

बीटीडब्ल्यू: यह उल्लेख किया गया है कि इस दृष्टिकोण को प्रभावशाली जावा पुस्तक से अनुकूलित किया गया है जोशुआ ब्लोच (प्रेंटिस हॉल) – Kotu

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