ruby中独占或的关键字?

ruby中独占或的关键字?,ruby,boolean,xor,Ruby,Boolean,Xor,Ruby是否像“and”和“or”一样,有一个简单的英文关键字表示排他或?如果不是,这是因为独占还是不允许计算捷径?不,不允许,您只能使用^ 不知道为什么没有特别的,可能只是因为它不常用。试试^ true ^ false #=> true true ^ true #=> false false ^ false #=> false 但是没有简单的英语等价运算符。首先,我认为短路不能合理地应用于异或:无论第一个操作数的值是什么,都需要检查第二个操作数 其次,和、&、或和|

Ruby是否像“and”和“or”一样,有一个简单的英文关键字表示排他或?如果不是,这是因为独占还是不允许计算捷径?

不,不允许,您只能使用
^

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

试试
^

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

但是没有简单的英语等价运算符。

首先,我认为短路不能合理地应用于异或:无论第一个操作数的值是什么,都需要检查第二个操作数

其次,和、&、或和| |在所有情况下都使用短路;“单词”和“符号”版本之间的唯一区别是优先级。我相信
提供了与perl在以下行中相同的功能

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

xor
的任何实现都不允许短路。无论发生什么情况,都需要对这两个表达式求值

Ruby确实提供了
^
操作符,但这会阻塞truthy值。我已经实现了一个函数来处理这样的情况:我需要一个行为更像
xor

def xor(a,b)
  (a and (not b)) or ((not a) and b)
end
^
不同,此功能可在类似以下情况下使用:

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

约翰的回答似乎不正确。在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 

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

!!foo ^ !!bar
相当于

nil ^ foo ^ bar

在我看来,这看起来更整洁,而且我想需要的逻辑运算也少了一点

有趣,但与问题没有太大关系。+++有用。我来这里寻找XOR,但知道如何做相反的事情,也就是,强迫一个布尔值到_I?我的另一个操作数已经是int,我需要结果是int。@Macha+1ing,因为我刚刚遇到了同样的问题,关于Ruby boolean XOR没有其他问题不是关于字符串。因为基本上你是在检查值是否不同,你实际上可以保存一个
然后只需执行:
!福^!条形码。或者
!福!bar
事实上,您只需要将第一个值设置为布尔值<代码>!!var1^var2
。另外
nil
^
运算符用作布尔异或。我认为“低优先级
xor
函数中没有点”是不对的。在Perl中,我被用来检查两个独占的CGI参数,类似于
param1或xor param2
。遗憾的是,我需要在Ruby中以更复杂的方式来实现这一点。现在,我同意
以及
作为控制流。Avdi在(事实上,我在那篇博文的评论部分链接到了这个问题)
^
遇到了truthy值的问题。我定义了自己的函数:我刚刚被它击中。我正在使用ruby prof改进一个算法,我认为用XOR简化某些条件会使它更快。但情况正好相反。克里斯·菲尼克斯(Chris Phoenix)关于异或(“纸杯蛋糕”,false)
返回true的回答/评论是正确的。我的问题是
true^true^true
=>
true
@MrYoshiji如果操作顺序是(true^true)^true,这是有意义的。括号的计算结果为false,为您提供false^true,最后为true。