फिर से खोलने इस सवाल का जवाब देने की कोशिश में: 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'
एक साधारण 'सुपर (o.is_a (स्ट्रिंग) o.downcase? ओ)' एक बेहतर विचार हो सकता है। –
धन्यवाद। वह काम करता है, हाँ। यदि मैं एक कस्टम क्लास बनाता हूं, तो कहें, स्ट्रिंग 2, जहां मैं हैश विधि परिभाषित करता हूं, आदि, जब मैं अपनी ऑब्जेक्ट को किसी सेट में जोड़ता हूं तो इन विधियों को कॉल किया जाता है। क्यूं कर? (मैंने अपना प्रश्न संपादित किया)। – akonsu
रूबी स्रोत (https://github.com/ruby/ruby/blob/trunk/hash.c#L1195) एक सुराग दे सकता है। ऐसा लगता है कि 'स्ट्रिंग को एमआरआई में हैश कुंजी के रूप में विशेष उपचार मिलता है। – Luke