为什么return语句会破坏条件运算符?

时间:2011-11-13 14:55:16

标签: ruby ternary-operator

尝试使用ruby中的条件运算符

def nada
  false ? true : nil
end

def err
  false ? true : raise('false')
end

按预期工作但

def reflection
  false ? true : return false
end

生成syntax error, unexpected keyword_false, expecting keyword_end

def reflection
  false ? true : return(false)
end

并尝试使用方括号syntax error, unexpected tLPAREN, expecting keyword_end

def reflection
  false ? true : (return false)
end

按预期工作,更详细if ... then ... else ... end

def falsy
  if false then true else return false end
end

也按预期工作。

那么条件(三元)算子怎么办?

3 个答案:

答案 0 :(得分:19)

通过将整个return表达式放在括号中,您可以像这样使用它:

def reflection
  false ? true : (return false)
end

当然,这样使用起来并没有多大意义,但是因为你正在试验(好!),以上工作!错误是因为我认为Ruby语法的工作方式 - 它期望某个结构形成一个有效的表达式。

<强>更新

draft specification

中引用一些信息
  

表达式是一个构成语句的程序构造(参见12   )。单个表达式可以是语句作为表达式语句   (见12.2).12

     

注意表达式和语句之间的差异是a   表达式通常用于需要其值的情况,但是a   声明通常用于其价值不一定的地方   需要。但是,也有一些例外。例如,a   jump-expression(见11.5.2.4)没有值和值   可以使用复合语句的最后一个语句。

NB。在上文中, jump-expression 包括return等。

答案 1 :(得分:6)

我认为这都与ruby解析器有关。

  • ruby​​将return解析为三元运算符的else-expression
  • 当ruby发现false而不是end
  • 时,会感到惊讶
  • 在括号中包裹return false会导致ruby将整个事物解释为else-expression
  • return(false)无法正常工作,因为ruby仍在尝试将return部分解释为else-expression,并在发现左括号时感到惊讶(已更新) )

注意:我不认为这是一个很好的答案。

例如,一个很好的答案可以参考ruby语法来解释解析错误。

答案 2 :(得分:2)

运营商就是这样的运营商。你没有从它返回。你从函数返回。当你在if中返回一个返回时,你从if所在的函数返回。由于没有等待if的结果的变量,所以没有问题。从ternery运算符返回时,没有为变量赋值。