Ruby中数组之间差异的自定义比较运算符

时间:2013-11-23 16:16:12

标签: ruby

我有两个类的数组。我想找到它们之间的区别。但是我希望它基于对该类的每个实例的特定方法调用的值,而不是整个实例。这是我在课堂上使用Hash的一些示例代码。

#!/usr/bin/ruby

require 'awesome_print'

class Hash
  def <=> other
    puts 'space ship'
    self[:a] <=> other[:a]
  end
  def == other
    puts 'double equal'
    self[:a] == other[:a]
  end
  def > other
    puts 'greater than'
    self[:a] > other[:a]
  end
  def < other
    puts 'less than'
    self[:a] < other[:a]
  end
  def >= other
    puts 'greater equal'
    self[:a] >= other[:a]
  end
  def <= other
    puts 'less equal'
    self[:a] <= other[:a]
  end
  def eql? other
    puts 'eql?'
    self[:a].eql? other[:a]
  end
  def equal? other
    puts 'equal?'
    self[:a].equal? other[:a]
  end
end

c  = { a: 1, b: 2, c: 3}
d  = { a: 2, b: 3, c: 4}
e1 = { a: 3, b: 4, c: 5}
e2 = { a: 3, b: 4, c: 5}
e3 = { a: 3, b: 5, c: 4}
f1 = { a: 4, b: 5, c: 6}
f2 = { a: 4, b: 5, c: 6}
f3 = { a: 4, b: 6, c: 5}
g  = { a: 5, b: 6, c: 7}
h  = { a: 6, b: 7, c: 8}

a = [c, d, e1, f1]
b = [e3, f3, g, h]

ap (a - b)

我期望在最终数组中看到2个元素,但仍然看到4.尝试覆盖每个元素的类的所有各种比较运算符,在这种情况下为Hash,我可以看到对“double equal”的一些调用,但它仍然没有适当的效果。我做错了什么?

1 个答案:

答案 0 :(得分:1)

Array#-使用eql? / hash协议,就像HashSetArray#uniq一样:

class Hash
  def eql? other
    puts 'eql?'
    self[:a].eql? other[:a]
  end
  def hash
    puts 'hash'
    self[:a].hash
  end
end

c  = { a: 1, b: 2, c: 3}
d  = { a: 2, b: 3, c: 4}
e1 = { a: 3, b: 4, c: 5}
e2 = { a: 3, b: 4, c: 5}
e3 = { a: 3, b: 5, c: 4}
f1 = { a: 4, b: 5, c: 6}
f2 = { a: 4, b: 5, c: 6}
f3 = { a: 4, b: 6, c: 5}
g  = { a: 5, b: 6, c: 7}
h  = { a: 6, b: 7, c: 8}

a = [c, d, e1, f1]
b = [e3, f3, g, h]

a - b
# => [{a: 1, b: 2, c: 3}, {a: 2, b: 3, c: 4}]