3

2 つのオブジェクトを XOR する必要があり、Ruby の組み込み XOR 演算子 ( ) を使用できると思ったのですが、うまくいき^ません。オブジェクトの 1 つだけが初期化されたことをテストするために使用したかったのです。

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

興味深いことに、私はできる

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

Ruby が本質的に 2 つのオブジェクトの XOR を許可しないのは奇妙だと思います。不足している別のコマンドはありますか、それともこの機能は構築されていませんか?

明らかに私の問題の解決策は、次のことを行うことです:

(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 に答える