`&&`和`||`替换`if`-`else`语句?

时间:2016-03-23 16:56:19

标签: ruby

有人可以解释如何解释以下红宝石块的摘录吗?

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

返回

"eno"

该表达式如何替换if - else - 语句?

2 个答案:

答案 0 :(得分:2)

如果左侧的表达式评估为真值(除&&nil之外的任何值),则false运算符右侧的表达式仅被计算。这称为short-circuit evaluation。基本思想是,如果左侧评估为false,我们知道&&运算符的整体值将为false,所以让我们通过甚至不评估表达式来节省一些CPU时间(并避免一些副作用)在右边。

所以行

s.length > 1 && s.reverse!

相当于

if s.length > 1
  s.reverse!
end

答案 1 :(得分:1)

s.length > 1真实时,会对s.reverse!进行评估以确定其是否真正进一步真实。如果是,则s.length > 1 && s.reverse!被评估为真实。在这种情况下,不评估s。否则,将评估s

所以它与

不一样
if s.length > 1
  s.reverse!
else
  s
end

但与

相同
if s.length > 1 and s.reverse!
else
  s
end