8

当我调用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 中,它似乎会导致无限循环。

4

1 回答 1

5

的源代码Array#-

似乎不是测试相等性,而是从第二个数组生成哈希。该数组中未包含的任何内容都被推入结果数组。

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

于 2011-09-19T22:14:46.397 回答