2016-03-23 168 views
-3

有人可以请解释如何解释下面的红宝石块摘录?`&&`和`||`替换`if` -`else`语句?

s = "one" 
s.length > 1 && s.reverse! || s 

回报

"eno" 

这怎么可能是表达一种替代if - else语句来?

+3

不返回'ONE',它返回'eno'。而这些操作符的优先级从左到右。 – squiguy

+0

Jep,从错误的工作区复制,编辑原始帖子 –

+0

,当s的长度大于1时,您希望结果为“ONE”? –

回答

2

&&运算符右侧的表达式仅在左侧表达式求值为真值(除nilfalse之外的任何值)时才被评估。这叫做short-circuit evaluation。其基本思想是,如果左侧评估结果为false,我们知道&&运算符的总体值将是错误的,所以让我们节省一些CPU时间(并避免一些副作用),因为甚至没有评估右侧的表达式。

所以线

s.length > 1 && s.reverse! 

相当于

if s.length > 1 
    s.reverse! 
end 
1

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 
+0

Mmhhhh,但是如何根据您的建议评估不会返回bool的方法? –

+0

在Ruby中,任何对象都可以在逻辑操作中发生。 – sawa

+0

好的,我在控制台上检查过,很有道理。但是,那么最后的解释是什么:纯布尔逻辑还是像David Grayson所说的那样 - 陈述短路评估?据我了解后者意味着,如果's.length> n'评估为'false',那么'reverse!'-method不会被触及 –