为什么真相&&“字符串”返回“字符串”

诺亚·克拉克(Noah Clark)

假设我有一个类似的东西

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值。为什么这样做呢?这是正确的心理模型吗?

阿尔贝托·莫里科尼(Alberto Moriconi)

ruby中的布尔运算符是短路的:如果可以从左手参数确定表达式的值,则不对右手参数求值。

因此,评估布尔表达式所涉及的一个更简单的思维模型&&是考虑仅涉及两个操作数的第一个表达式:首先评估左操作数;然后评估第一个表达式。如果此操作数的值为nilor false,则返回该操作数,并且不评估右侧操作数;如果左侧操作数是其他任何值,则将评估右侧运算符并返回其值。

从这个定义中可以清楚地看出,正如您所注意到的,涉及布尔运算符的表达式不会返回trueor false,而只是返回truefalse值得注意的是,这在只将布尔表达式用于truefalse的上下文中没有任何区别

由于布尔运算符是左关联的,因此很容易确定包含多个运算符的表达式的求值顺序,请记住其&&优先级要高于||(但是要小心andor具有相同的优先级)。这样做之后,我们可以很容易地看到,表达式的值是最后评估的元素,即元素允许以确定总体真正的烦躁假内斯表达。

在您的示例(仅由&&运算符组成的表达式)中,一旦遇到第一个false值,或者在最后一个元素被评估为true值之后,该表达式的值就会被知道因此,如果最后一个元素的值均为true,则最后一个评估的元素将为最后一个元素;如果遇到第一个值为false的元素,则为第一个为false的元素。

您可能想知道为什么表达式的值未转换为trueor false实际上,这种行为可以用在成语中

x = x || default

或更简短

x ||= default

用于检查是否x存在nil,在这种情况下,为其分配默认值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么++ [[]] [+ []] + [+ []]返回字符串“ 10”?

为什么我的 for 循环返回字符而不是字符串

为什么字符串文字不是字符串?

为什么“字符串”-“字符串”为NaN?

为什么Java字符串方法将null作为字符串返回?

为什么dynamic.ToString()返回字符串之间而不是字符串之间的内容?

C分割字符串函数在字符串末尾返回\ 377而不是\ 0。为什么?

为什么python max('a',5)返回字符串值?

为什么我的函数不返回字符串?

为什么 co_await 不能返回字符串?

为什么NumberFormatter的字符串(from :)返回可选的?

为什么从promise返回的字符串是不确定的?

为什么split方法仍然返回字符串

为什么%in%在匹配字符串时返回false?

为什么这个React组件返回字符串'0'

为什么字符串不返回其内存位置?

为什么此函数返回''而不是串联字符串

为什么函数不返回字符串?

为什么Jekyll的Liquid“包含”返回字符串?

为什么它返回错误的字符串?

为什么“ foo” .class ===字符串返回false?

为什么PHP函数“ implode”返回字符串“ array”?

为什么 glGetProgramInfoLog 返回空字符串?

为什么服务不返回编码字符串?

为什么返回值总是空字符串?

为什么数组以字符串形式返回

为什么char * foo()返回空字符串?

为什么以下字符串比较返回不同的结果?

为什么Tkinter getvar()返回Booleanvar的字符串类型?