即。我可以在类中定义自己的'=='方法,然后让集合交集运算符('&')使用它吗?或者,有没有办法覆盖'&'运营商本身? 我们可以这样做吗?
def &(another_object)
#Code for intersection
end
答案 0 :(得分:2)
首先,&
不是运营商。在LHO上调用方法&
是一种语法糖,将RHO作为唯一参数传递。
中学,我怀疑是否复制粘贴你的pry / irb尝试并检查它是否有效比在这里发布问题更难/更长。
class MyObject
def ==(other)
other.is_a?(MyObject) && self.&(other).empty?
end
def &(other)
[]
end
end
mo1, mo2 = 2.times.map { MyObject.new }
mo1 == mo2 #⇒ true
mo1 == 42 #⇒ false
答案 1 :(得分:0)
我可以定义自己的' =='类中的方法
是的,你可以:
class Foo
def ==(other)
# bla
end
end
然后让集合交叉运算符('&')使用它?
是的,你可以:
require 'set'
module MySetEqualityExtension
def &(other)
reduce([]) {|acc, el| if acc.any? {|a| a == el } then acc else acc << el end }
end
end
module MySetEquality
refine Set do
prepend MySetEqualityExtension
end
end
或者,有没有办法覆盖&#39;&amp;&#39;运营商本身? 我们可以这样做吗?
def &(another_object) #Code for intersection end
是。 (作为旁注:如果只是尝试而不是询问,那将花费你更少的时间和精力。)
class Foo
def &(other)
# bla
end
end
您可以执行所有要求,但正确的方式是简单地实现eql?
和hash
,这是Set#&
使用的