Как 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).