我必须对两个对象进行异或,并认为我可以使用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)
答案 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
那是因为NilClass
有nil ^ 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。