有没有办法在ruby中覆盖集合交集?

时间:2017-10-26 02:27:20

标签: ruby-on-rails ruby override

即。我可以在类中定义自己的'=='方法,然后让集合交集运算符('&')使用它吗?或者,有没有办法覆盖'&'运营商本身? 我们可以这样做吗?

def &(another_object)
   #Code for intersection       
end

2 个答案:

答案 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#&使用的