当我打电话给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 :(得分:5)
看来,不是测试相等性,而是从第二个数组中进行哈希。该数组中未包含的任何内容都将被推送到结果数组中。
1.8.7中的数组差异也是以这种方式实现的。对String的更改只会导致irb中的问题(不是在普通的ruby脚本中)。