我有两个类的数组。我想找到它们之间的区别。但是我希望它基于对该类的每个实例的特定方法调用的值,而不是整个实例。这是我在课堂上使用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”的一些调用,但它仍然没有适当的效果。我做错了什么?
答案 0 :(得分:1)
Array#-
使用eql?
/ hash
协议,就像Hash
,Set
和Array#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}]