7

जब मैं Array#- को कॉल करता हूं तो ऐसा लगता है कि मैं तुलना कर रहे तारों पर किसी भी तुलना विधि को कॉल नहीं करता:ऐरे # - (ऑपरेटर घटाना) समानता के तत्वों की तुलना कैसे करता है?

class String 
    def <=>(v) 
    puts "#{self} <=> #{v}" 
    super(v) 
    end 

    def ==(v) 
    puts "#{self} == #{v}" 
    super(v) 
    end 

    def =~(v) 
    puts "#{self} =~ #{v}" 
    super(v) 
    end 

    def ===(v) 
    puts "#{self} == #{v}" 
    super(v) 
    end 

    def eql?(v) 
    puts "#{self}.eql? #{v}" 
    super(v) 
    end 

    def equal?(v) 
    puts "#{self}.equal? #{v}" 
    super(v) 
    end 

    def hash() 
    puts "#{self}.hash" 
    super 
    end 
end 

p %w{one two three} - %w{two} 

यह सिर्फ लौटाता है:

["one", "three"] 

तो, Array#- क्या कर रहा है?

इसके अलावा, मैं रूबी 1.9.2p290 का उपयोग कर रहा हूं। 1.8.7 में यह एक अनंत लूप का कारण बनता है।

+0

इसे 'irb' (!) के साथ आमंत्रित करने का प्रयास करें। अपनी कक्षा परिभाषा पढ़ने के बाद यह एक अनंत लूप में जाता है। –

+1

@ जोशली क्या मतलब है कि यह एक अनंत लूप में प्रवेश करता है? जब मैं स्क्रिप्ट को निष्पादित यह किसी भी समस्या के – Zequez

+0

यह पता प्रिंट एन == एन एन == मीटर मीटर == मीटर एन == n मीटर == n एम == n एल के बिना बाहर निकल जाता है == एन ओवर और ओवर ... –

उत्तर

5

source code for Array#-

ऐसा लगता है कि समानता के परीक्षण के बजाय, हैश दूसरे सरणी से बना है। उस सरणी में निहित कुछ भी परिणामस्वरूप सरणी में धक्का दिया जाता है।

1.8.7 में ऐरे अंतर इस तरह से लागू किया गया है। स्ट्रिंग में परिवर्तन केवल irb में समस्याएं पैदा करते हैं (सादे रूबी स्क्रिप्ट में नहीं)।

+0

अच्छी व्याख्या। यह प्राइ में भी समस्याएं पैदा करता है ... – lucapette

+0

@ लुकपेट: आह ठीक है, शायद किसी भी प्रतिलिपि में समस्याएं होंगी। – cam

+0

लेकिन यदि यह समानता के लिए परीक्षण नहीं कर रहा है तो यह कैसे जानता है कि सरणी में कुछ शामिल है या नहीं? मेरा मतलब है, इसे किसी बिंदु पर समानता के लिए परीक्षण करना होगा? : | – Zequez

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