独家或红宝石的关键字?

And*_*imm 15 ruby boolean xor

Ruby是否具有普通英语关键字,或者像"and"和"or"一样?如果不是,这是因为排他性还是不允许评估短期?

Gar*_*ler 21

不,它不能,你只能使用^.

不知道为什么没有特别的,可能只是因为它不常用.


Mat*_*orn 17

我遇到了一个问题,因为'^'运算符对数字按位运算,

true ^ 1
=> false

1 ^ true
TypeError: can't convert true into Integer
true ^ 1
Run Code Online (Sandbox Code Playgroud)

所以我的解决方法是:

( !!a ^ !!b ) 双爆会将他们强制成布尔人.

!!1 ^ !!true
=> false

!!1 ^ !!false
=> true
Run Code Online (Sandbox Code Playgroud)

  • 由于基本上您要检查值是否不同,因此您实际上可以保存“!”并执行:“!foo ^ !bar”。或者 `!foo != !bar` (3认同)
  • ++ 有用。我来这里是为了寻找异或,但知道如何做相反的事情,即强制一个 bool to_i?我的另一个操作数已经是 int,我需要结果是 int。 (2认同)

Mik*_*use 13

首先,我不认为短路可以合理地应用于XOR:无论第一个操作数的值如何,第二个操作数都需要进行检查.

其次,和,&&,或和|| 在所有情况下都使用短路; "word"和"symbol"版本之间的唯一区别是优先级.我认为and并且or存在以提供与perl相同的功能

process_without_error or die
Run Code Online (Sandbox Code Playgroud)

我认为没有xor命名函数的原因可能是在这种情况下低优先级运算符没有意义,并且它已经是一个令人困惑的情况!


Ale*_*yne 10

尝试 ^

true  ^ false #=> true
true  ^ true  #=> false
false ^ false #=> false
Run Code Online (Sandbox Code Playgroud)

虽然没有简单的英语等效运算符

  • @MrYoshiji 如果操作顺序是 (true ^ true) ^ true 则有意义。括号的计算结果为 false,给出 false ^ true,最终为 true。 (3认同)

cha*_*son 7

作为Matt Van Horn在任意类型上使用XOR的双重否定技巧的替代方法,您可以链接另一个XOR测试,从开始nil.即:

!!foo ^ !!bar
Run Code Online (Sandbox Code Playgroud)

相当于

nil ^ foo ^ bar
Run Code Online (Sandbox Code Playgroud)

这看起来更贴近我的眼睛,我想这需要一个不太合乎逻辑的操作