7

當我打電話Array#-它似乎並不呼籲任何字符串比較方法我比較: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#-在做什麼?

另外,我正在使用Ruby 1.9.2p290。在1.8.7中似乎會導致無限循環。

+0

嘗試用'irb'(!)調用它。讀完你的類定義之後,它會進入無限循環。 –

+1

@JoshLee你是什麼意思它進入一個無限循環?當我執行該腳本退出而沒有任何問題 – Zequez

+0

它打印出 n ==可Ñ n ==可米 米==米 n ==可Ñ 米==Ñ 中號==Ñ 升== 一遍又一遍...... –

回答

5

source code for Array#-

看來,而不是測試相等,散列是從第二個數組。任何未包含在該數組中的內容都會被推入結果數組中。

1.8.7中的數組差異也以這種方式實現。對String的更改只會導致irb中的問題(而不是普通的ruby腳本)。

+0

很好的解釋。它在撬也造成問題... – lucapette

+0

@lucapette:啊好的,可能任何repl都會有問題。 – cam

+0

但是,如果它不測試相等性,它如何知道數組中是否包含某些內容?我的意思是,它必須在某個點測試平等嗎? :| – Zequez