有人可以请解释如何解释下面的红宝石块摘录?`&&`和`||`替换`if` -`else`语句?
s = "one"
s.length > 1 && s.reverse! || s
回报
"eno"
这怎么可能是表达一种替代if
- else
语句来?
有人可以请解释如何解释下面的红宝石块摘录?`&&`和`||`替换`if` -`else`语句?
s = "one"
s.length > 1 && s.reverse! || s
回报
"eno"
这怎么可能是表达一种替代if
- else
语句来?
&&
运算符右侧的表达式仅在左侧表达式求值为真值(除nil
或false
之外的任何值)时才被评估。这叫做short-circuit evaluation。其基本思想是,如果左侧评估结果为false,我们知道&&
运算符的总体值将是错误的,所以让我们节省一些CPU时间(并避免一些副作用),因为甚至没有评估右侧的表达式。
所以线
s.length > 1 && s.reverse!
相当于
if s.length > 1
s.reverse!
end
当s.length > 1
是truthy,s.reverse!
被评估,以确定它是进一步truthy。如果是,那么s.length > 1 && s.reverse!
被评估为truthy。在这种情况下,s
未被评估。否则,评估s
。
因此,它是不一样的
if s.length > 1
s.reverse!
else
s
end
但相同
if s.length > 1 and s.reverse!
else
s
end
Mmhhhh,但是如何根据您的建议评估不会返回bool的方法? –
在Ruby中,任何对象都可以在逻辑操作中发生。 – sawa
好的,我在控制台上检查过,很有道理。但是,那么最后的解释是什么:纯布尔逻辑还是像David Grayson所说的那样 - 陈述短路评估?据我了解后者意味着,如果's.length> n'评估为'false',那么'reverse!'-method不会被触及 –
不返回'ONE',它返回'eno'。而这些操作符的优先级从左到右。 – squiguy
Jep,从错误的工作区复制,编辑原始帖子 –
,当s的长度大于1时,您希望结果为“ONE”? –