Как Array # - (оператор вычитания) сравнивает элементы на равенство? - PullRequest
8 голосов
/ 20 сентября 2011

Когда я вызываю 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 Ответ

5 голосов
/ 20 сентября 2011

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

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

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

...