2009-03-10 15 views
5

मैं एक वर्ग है कि मैं दोनों तार और प्रतीकों एक मामले बयान में करने के लिए की तुलना करना चाहते है, तो मैंने सोचा कि मैं सिर्फ अपनी कक्षा के लिए ===() विधि ओवरराइड और सभी सोने होगा। हालांकि मामला कथन के दौरान मेरी ===() विधि कभी नहीं बुलाई जाती है। कोई विचार?आप रूबी केस समानता ऑपरेटर को कैसे ओवरराइड करते हैं? (===)

यहाँ कुछ उदाहरण कोड है, और क्या एक आईआरबी सत्र में होता है:

class A 
    def initialize(x) 
     @x=x #note this isn't even required for this example 
    end 
    def ===(other) 
     puts "in ===" 
     return true 
    end 
end 

आईआरबी (मुख्य): 010: 0> एक = A.new ("हाय")
=> #
आईआरबी (मुख्य): 011: 0> मामला एक
आईआरबी (मुख्य): 012: 1> जब "नमस्ते" तो 1
आईआरबी (मुख्य): 013: 1 बाकी> 2
आईआरबी (मुख्य) : 014: 1> अंत
=> 2

(यह संदेश प्रिंट कभी नहीं और हमेशा सच लौटना चाहिए वैसे भी) ध्यान दें कि आदर्श मैं अग्रिम में एक

def ===(other) 
      #puts "in ===" 
      return @x.===(other) 
end 

धन्यवाद करना चाहते हैं।

उत्तर

7

'मामले' कीवर्ड के बाद अभिव्यक्ति === अभिव्यक्ति की दाहिने हाथ की ओर है, और 'कब' कीवर्ड के बाद अभिव्यक्ति अभिव्यक्ति की बाएं हाथ की ओर है। तो, जिस विधि को बुलाया जा रहा है वह स्ट्रिंग है। ===, ए नहीं। ===।

तुलना पीछे के लिए त्वरित दृष्टिकोण:

class Revcomp 
    def initialize(obj) 
     @obj = obj 
    end 

    def ===(other) 
     other === @obj 
    end 

    def self.rev(obj) 
     Revcomp.new(obj) 
    end 
end 

class Test 
    def ===(other) 
     puts "here" 
    end 
end 

t = Test.new 

case t 
when Revcomp.rev("abc") 
    puts "there" 
else 
    puts "somewhere" 
end 
+0

कूल। यह बताता है, और यह काम करता है! क्या केस स्टेटमेंट करने का यह तरीका काउंटर अंतर्ज्ञानी लगता है? – Marcin

+0

अच्छा। हां, यह थोड़ा गन्दा लगता है, लेकिन मैंने इस जवाब के लिए सिंटैक्स को बहुत सोचा नहीं था। आप शायद कुछ और संक्षिप्त वाक्यविन्यास के साथ आ सकते हैं, या आप एलएचएस पर कक्षाओं में कक्षाओं में ओवरराइड ऑपरेटर === जैसे कुछ बुरा कर सकते हैं। – janm

+0

धन्यवाद - मैं थोड़ा अधिक संक्षिप्त हो सकता है लेकिन यह भी मुझे लगता है कि मैं शायद इस काम के लिए गलत उपकरण (मामला) का उपयोग कर रहा है, लेकिन यह काम करता है, तो आप (मैं इस कल कहा है चाहिए) धन्यवाद। – Marcin

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