Как 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 это, кажется, вызывает бесконечный цикл.

1 ответ

Решение

исходный код дляArray#-,

Похоже, что вместо проверки на равенство, из второго массива создается хеш. Все, что не содержится в этом массиве, помещается в результирующий массив.

Разница в массиве в 1.8.7 также реализована. Изменения в String вызывают проблемы только в irb (не в простом скрипте ruby).

Другие вопросы по тегам