3

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

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

有趣的是,我可以做到

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

我认为 Ruby 不允许您先天地异或两个对象,这很奇怪。我是否缺少另一个命令或者这个功能只是没有构建?

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

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

3 回答 3

4

这个怎么样?

a = Object.new
b = Object.new
c = nil
!a ^ !b # => false
!a ^ !c # => true
于 2013-02-05T00:19:30.713 回答
0

有趣的是,我可以做到

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

那是因为NilClassnil ^ obj方法。

我是否缺少另一个命令或者这个功能只是没有构建?

它不是建造的。

于 2013-02-04T23:03:58.043 回答
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.

于 2013-02-04T23:06:26.257 回答