【问题标题】:How does Array#- (subtract operator) compare elements for equality?Array#-(减法运算符)如何比较元素是否相等?
【发布时间】:2011-11-20 14:37:47
【问题描述】:

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

【问题讨论】:

  • 尝试使用irb (!) 调用它。阅读您的类定义后,它会进入无限循环。
  • @JoshLee 进入无限循环是什么意思?当我执行脚本时,它会毫无问题地退出
  • 它一遍又一遍地打印出 N == N N == m m == m N == n m == n M == n l == n…
  • 有趣的问题。 ['one', 'two', 'three'].delete('two') 使用 ==。你忘记了equal?,但不是搜索到的那个。
  • @JoshLee 至少不在我的电脑里,我正在使用 ruby​​ 1.9.2p290

标签: ruby arrays operator-overloading subtraction comparison-operators


【解决方案1】:

source code for Array#-.

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

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

【讨论】:

  • @lucapette:嗯,好吧,可能任何repl都会有问题。
  • 但是如果它不测试相等性,它怎么知道数组中是否包含某些东西?我的意思是,它必须在某个时候测试是否相等,对吧? :|
  • @Zequez:不,它只需要对字符串进行哈希处理(参见"foo".hash)。哈希查找是它如何确定一个项目是否包含在数组中。
  • @cam Ohhhhhh 我现在明白了,所以,没有不区分大小写的数组减法然后哈哈。非常感谢您清除它! ñ.ñ 虽然它没有调用字符串中的hash方法仍然很奇怪=/
  • 那么,如果它对字符串进行哈希处理,为什么hash 不被String 调用?
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2011-04-25
  • 2020-12-10
相关资源
最近更新 更多