【发布时间】:2010-10-09 18:28:22
【问题描述】:
Ruby 是否有一个纯英文关键字来表示异或,就像它们有“and”和“or”一样?如果不是,这是因为独占还是不允许评估捷径?
【问题讨论】:
Ruby 是否有一个纯英文关键字来表示异或,就像它们有“and”和“or”一样?如果不是,这是因为独占还是不允许评估捷径?
【问题讨论】:
不行,你只能使用^。
不知道为什么没有特别的,可能是因为不常用。
【讨论】:
^ 遇到了真实值的问题。我定义了自己的函数:
我遇到了一个问题,因为 '^' 运算符按位作用于数字,
true ^ 1
=> false
1 ^ true
TypeError: can't convert true into Integer
true ^ 1
所以我的解决方法是:
( !!a ^ !!b ) 双键将它们强制转换为布尔值。
!!1 ^ !!true
=> false
!!1 ^ !!false
=> true
【讨论】:
! 并执行以下操作:!foo ^ !bar。或!foo != !bar
!!var1 ^ var2。此外,nil 的 ^ 运算符用作布尔异或。
首先,我认为短路不适用于 XOR:无论第一个操作数的值如何,都需要检查第二个操作数。
其次,and, &&, or and ||在所有情况下都使用短路; “单词”和“符号”版本之间的唯一区别是优先级。我相信 and 和 or 的存在是为了提供与 perl 在类似
process_without_error or die
我认为没有 xor 命名函数的原因可能是在这种情况下低优先级运算符没有意义,而且这已经是一个足够令人困惑的情况了!
【讨论】:
xor函数没有意义”是不对的。在 Perl 中,我习惯于用 param1 xor param2 之类的东西检查两个专有的 CGI 参数。可惜我需要在 Ruby 中以更复杂的方式做到这一点。
and 和 or 是控制流。 Avdi 在devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby 上写得很好(事实上,我在那篇博文的 cmets 部分链接到了这个问题)
试试^
true ^ false #=> true
true ^ true #=> false
false ^ false #=> false
虽然没有简单的英语等效运算符。
【讨论】:
true ^ true ^ true => true
作为对任意类型使用 XOR 的 Matt Van Horn 的双重否定技巧的替代方法,您可以链接另一个 XOR 测试,从 nil 开始。即:
!!foo ^ !!bar
等价于
nil ^ foo ^ bar
在我看来这看起来更整洁,我想需要更少的逻辑操作
【讨论】:
xor 的任何实现都不允许短路。无论如何,这两个表达式都需要计算。
Ruby 确实提供了^ 运算符,但这会阻塞真实值。我已经实现了一个函数来处理我想要一个行为更像and 和or 的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
【讨论】:
xor("cupcake", false) 返回 true 的回答/评论是正确的。
约翰的回答似乎不正确。在 irb 1.9.3 中,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
【讨论】: