独家或ruby的关键字?

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

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

其次,和,&&,或和|| 在所有情况下都使用短路; “word”和“symbol”版本之间的唯一区别是优先级。 我相信andor提供与perl一样的function

 process_without_error or die 

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

不,它没有,你只能使用^

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

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

 true ^ 1 => false 1 ^ true TypeError: can't convert true into Integer true ^ 1 

所以我的解决方法是:

( !!a ^ !!b )双爆炸强迫他们进入布尔。

 !!1 ^ !!true => false !!1 ^ !!false => true 

试试^

 true ^ false #=> true true ^ true #=> false false ^ false #=> false 

但是,没有简单的英语等效运算

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

 !!foo ^ !!bar 

相当于

 nil ^ foo ^ bar 

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

约翰的回答似乎不正确。 在1.9.3的irb中,xor(“cupcake”,false)返回true,正如您所期望的那样。

 1.9.3-p429 :104 > def xor(a,b) 1.9.3-p429 :105?> (a and (not b)) or ((not a) and b) 1.9.3-p429 :106?> end => nil 1.9.3-p429 :107 > xor(false, true) => true 1.9.3-p429 :108 > xor("cupcake", false) => true 

任何xor实现都不允许短路。 无论如何,都需要评估这两个表达式。

Ruby确实提供了^运算符,但这会阻碍truthy值。 我已经实现了一个函数来处理我想要一个行为更像的xoror

 def xor(a,b) (a and (not b)) or ((not a) and b) end 

^不同,此function可用于与以下类似的情况:

 xor("hello".match(/llo/), false) # => true xor(nil, 1239) # => true xor("cupcake", false) # => false