假设我有一个类似的东西
true && true #=> true
这很有意义,所以我尝试类似的方法:
true && "dsfdsf" #=> "dsfdsf"
这让我感到惊讶,因为很多时候我会做类似的事情,if something && something
而且我一直以为那会评估为true并会返回true。进行进一步的实验,例如:
jruby-1.7.3 :009 > "ad" && "dsf"
=> "dsf"
jruby-1.7.3 :010 > "ad" && "sdfd" && nil
=> nil
jruby-1.7.3 :011 > "ad" && nil && "sdf"
=> nil
使得Ruby似乎返回了所有都为true的最后一个值或找到的第一个false值。为什么这样做呢?这是正确的心理模型吗?
ruby中的布尔运算符是短路的:如果可以从左手参数确定表达式的值,则不对右手参数求值。
因此,评估布尔表达式所涉及的一个更简单的思维模型&&
是考虑仅涉及两个操作数的第一个表达式:首先评估左操作数;然后评估第一个表达式。如果此操作数的值为nil
or false
,则返回该操作数,并且不评估右侧操作数;如果左侧操作数是其他任何值,则将评估右侧运算符并返回其值。
从这个定义中可以清楚地看出,正如您所注意到的,涉及布尔运算符的表达式不会返回true
or false
,而只是返回true或false。值得注意的是,这在只将布尔表达式用于true或false的上下文中没有任何区别。
由于布尔运算符是左关联的,因此很容易确定包含多个运算符的表达式的求值顺序,请记住其&&
优先级要高于||
(但是要小心and
并or
具有相同的优先级)。这样做之后,我们可以很容易地看到,表达式的值是最后评估的元素,即元素允许以确定总体真正的烦躁或假内斯表达。
在您的示例(仅由&&
运算符组成的表达式)中,一旦遇到第一个false值,或者在最后一个元素被评估为true值之后,该表达式的值就会被知道;因此,如果最后一个元素的值均为true,则最后一个评估的元素将为最后一个元素;如果遇到第一个值为false的元素,则为第一个为false的元素。
您可能想知道为什么表达式的值未转换为true
or false
;实际上,这种行为可以用在成语中
x = x || default
或更简短
x ||= default
用于检查是否x
存在nil
,在这种情况下,为其分配默认值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句