Array# - (减法运算符)如何比较元素是否相等?

Zeq*_*uez 8 ruby arrays operator-overloading subtraction comparison-operators

当我调用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}
Run Code Online (Sandbox Code Playgroud)

它只是返回:

["one", "three"]
Run Code Online (Sandbox Code Playgroud)

那么,Array#-做什么?

另外,我使用的是Ruby 1.9.2p290.在1.8.7中它似乎导致无限循环.

cam*_*cam 5

的源代码Array#-.

似乎不是测试相等性,而是从第二个数组中进行散列.该数组中未包含的任何内容都将被推送到结果数组中.

1.8.7中的数组差异也是以这种方式实现的.对String的更改只会导致irb中的问题(不是在普通的ruby脚本中).