尝试使用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
也按预期工作。
答案 0 :(得分:19)
通过将整个return
表达式放在括号中,您可以像这样使用它:
def reflection
false ? true : (return false)
end
当然,这样使用起来并没有多大意义,但是因为你正在试验(好!),以上工作!错误是因为我认为Ruby语法的工作方式 - 它期望某个结构形成一个有效的表达式。
<强>更新强>
中引用一些信息表达式是一个构成语句的程序构造(参见12 )。单个表达式可以是语句作为表达式语句 (见12.2).12
注意表达式和语句之间的差异是a 表达式通常用于需要其值的情况,但是a 声明通常用于其价值不一定的地方 需要。但是,也有一些例外。例如,a jump-expression(见11.5.2.4)没有值和值 可以使用复合语句的最后一个语句。
NB。在上文中, jump-expression 包括return
等。
答案 1 :(得分:6)
我认为这都与ruby解析器有关。
return
解析为三元运算符的else-expression false
而不是end
return false
会导致ruby将整个事物解释为else-expression return(false)
无法正常工作,因为ruby仍在尝试将return
部分解释为else-expression,并在发现左括号时感到惊讶(已更新) )强> 注意:我不认为这是一个很好的答案。
例如,一个很好的答案可以参考ruby语法来解释解析错误。
答案 2 :(得分:2)
运营商就是这样的运营商。你没有从它返回。你从函数返回。当你在if中返回一个返回时,你从if所在的函数返回。由于没有等待if的结果的变量,所以没有问题。从ternery运算符返回时,没有为变量赋值。