XOR-ing两个对象

时间:2013-02-04 22:48:44

标签: ruby

我必须对两个对象进行异或,并认为我可以使用Ruby的内置XOR运算符(^),但它不起作用。我想用它来测试我的一个对象是否已初始化。

a = Object.new
b = Object.new
a ^ b # => NoMethodError: undefined method `^' for #<Object:0x007...>

有趣的是,我可以做到

a = nil
b = Object.new
a ^ b # => true

我认为Ruby不允许你天生地对两个对象进行XOR,这很奇怪。还有其他命令我缺少或者这个功能是不是没有构建?

显然我的问题的解决方案是执行以下操作:

(a || b) && !(a && b) 

3 个答案:

答案 0 :(得分:4)

这个怎么样?

a = Object.new
b = Object.new
c = nil
!a ^ !b # => false
!a ^ !c # => true

答案 1 :(得分:0)

  

有趣的是,我可以做到

a = nil
b = Object.new
a ^ b # => true

那是因为NilClassnil ^ obj方法。

  

是否还有其他命令我缺少或者这个功能还没有建成?

它没有建成。

答案 2 :(得分:0)

您需要覆盖对象的^运算符(实际上是方法)。类似的东西:

class YourObject
  def ^(rhs)
    # You may want to do a check here that 
    #   rhs is of the same type as your object,
    #   and throw an error if not
   (self || rhs) && !(self && rhs)
  end
end

我建议您替换自己的类,而不是更改Object。