2012-12-21 10 views
7

फिर से खोलने इस सवाल का जवाब देने की कोशिश में: How can I make the set difference insensitive to case?, मैं सेट और तार के साथ प्रयोग किया गया था, तार का एक केस-संवेदी सेट करने के लिए कोशिश कर रहा। लेकिन किसी कारण जब मैं स्ट्रिंग वर्ग को फिर से खोलने के लिए, अपने कस्टम तरीकों में से कोई भी लागू जब मैं एक सेट के लिए एक स्ट्रिंग जोड़ने कर रहे हैं। कोड में नीचे मुझे कोई उत्पादन देखते हैं, लेकिन मैं ऑपरेटरों है कि मैं करने के लिए लागू किया जा अतिभारित कम से कम एक उम्मीद। ऐसा क्यों है?तार का एक सेट और स्ट्रिंग

संपादित करें: यदि मैं एक कस्टम वर्ग बनाने के लिए, string2, जहां मैं एक हैश विधि, आदि को परिभाषित, इन तरीकों जब मैं एक सेट करने के लिए अपनी वस्तु को जोड़ने बुलाया मिलता है, का कहना है। स्ट्रिंग क्यों नहीं?

require 'set' 

class String 
    alias :compare_orig :<=> 
    def <=> v 
    p '<=>' 
    downcase.compare_orig v.downcase 
    end 

    alias :eql_orig :eql? 
    def eql? v 
    p 'eql?' 
    eql_orig v 
    end 

    alias :hash_orig :hash 
    def hash 
    p 'hash' 
    downcase.hash_orig 
    end 
end 

Set.new << 'a' 

उत्तर

4

Set के लिए source code को देखते हुए, यह भंडारण के लिए एक सरल हैश का उपयोग करता है:

def add(o) 
    @hash[o] = true 
    self 
end 

तो ऐसा लगता है कि आप के बजाय खोलने की क्या करने की जरूरत String खुला Set है। मैं इस परीक्षण नहीं किया है, लेकिन यह आप सही अंदाज़ा हो जाना चाहिए:

class MySet < Set 
    def add(o) 
    if o.is_a?(String) 
     @hash[o.downcase] = true 
    else 
     @hash[o] = true 
    end 
    self 
    end 
end 

संपादित

के रूप में टिप्पणी में बताया गया है, यह एक बहुत सरल तरीके से लागू किया जा सकता:

class MySet < Set 
    def add(o) 
    super(o.is_a?(String) ? o.downcase : o) 
    end 
end 
+1

एक साधारण 'सुपर (o.is_a (स्ट्रिंग) o.downcase? ओ)' एक बेहतर विचार हो सकता है। –

+0

धन्यवाद। वह काम करता है, हाँ। यदि मैं एक कस्टम क्लास बनाता हूं, तो कहें, स्ट्रिंग 2, जहां मैं हैश विधि परिभाषित करता हूं, आदि, जब मैं अपनी ऑब्जेक्ट को किसी सेट में जोड़ता हूं तो इन विधियों को कॉल किया जाता है। क्यूं कर? (मैंने अपना प्रश्न संपादित किया)। – akonsu

+0

रूबी स्रोत (https://github.com/ruby/ruby/blob/trunk/hash.c#L1195) एक सुराग दे सकता है। ऐसा लगता है कि 'स्ट्रिंग को एमआरआई में हैश कुंजी के रूप में विशेष उपचार मिलता है। – Luke

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