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