8

私が呼び出すとき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#-ですか?

また、Ruby1.9.2p290を使用しています。1.8.7では、無限ループが発生するようです。

4

1 に答える 1

5

のソースコードArray#-

同等性をテストするのではなく、2番目の配列からハッシュが作成されるようです。その配列に含まれていないものはすべて、結果の配列にプッシュされます。

1.8.7の配列の違いもこの方法で実装されます。Stringへの変更は、irbでのみ問題を引き起こします(単純なrubyスクリプトでは発生しません)。

于 2011-09-19T22:14:46.397 に答える