2014-01-26 146 views
3

这今天我花了相当长的一段时间,我发现finaly的原因,但仍然没有得到逻辑false或true!= true或false!= true ||假

x = (complex expression evaluating to false) or (complex expression evaluating to true) 

x => false 

很奇怪......事实证明,试验后

false or true => false 
true or false => true 
false || true => true 
true || false => true 

我想我在我的代码中有数百个地方使用了“或”运算符,说实话,我不相信“或”了...

有人可以解释“逻辑” ?

+0

你的第二个模块并不严格正确。你实际上有一些像'x = false或true; p x#=> false',对吗?这是分配发生时让你感到困惑的时刻。简而言之,赋值只是另一个运算符,它在*'或'之前*和*'||'之后被处理。通常你需要'||',但是'或'的语义在时间上仍然很有用。 –

回答

4

根据precedenceor的优先级低于=。因此x = true or false将被评估为(x = true) or false。但||优先于=x = true || false将评估为x = (true || false)

x = false or true 
x # => false 
x = false || true 
x # => true 
1
x = ((complex expression evaluating to false) or (complex expression evaluating to true)) 
# or 
x = (complex expression evaluating to false) || (complex expression evaluating to true) 

在此表达

x = (complex expression evaluating to false) or (complex expression evaluating to true) 

这里实际上是两个人。首先是转让

x = (complex expression evaluating to false) 

如果分配将返回false第二个表达式将被评估。但即使第二个表达式为真,x也将是false

这是因为or happenning具有较小的优先级,然后=

3

首先表达false or truetrue or falsefalse || truetrue || false都是true的。如果你将它们键入irb,你会看到。

您的代码无法正常工作的原因是or=的优先级。 x = y or z被解析为(x = y) or z,而不是x = (y or z)。使用||它被解析为x = (y || z),因为||具有更高的优先级。