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

Ale*_*ski 12 ruby ternary-operator

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

def nada
  false ? true : nil
end

def err
  false ? true : raise('false')
end
Run Code Online (Sandbox Code Playgroud)

按预期工作但是

def reflection
  false ? true : return false
end
Run Code Online (Sandbox Code Playgroud)

生产一个 syntax error, unexpected keyword_false, expecting keyword_end

def reflection
  false ? true : return(false)
end
Run Code Online (Sandbox Code Playgroud)

和括号尝试 syntax error, unexpected tLPAREN, expecting keyword_end

然而

def reflection
  false ? true : (return false)
end
Run Code Online (Sandbox Code Playgroud)

如预期,以及更详细的工作if... ... then... ... else... ...end

def falsy
  if false then true else return false end
end
Run Code Online (Sandbox Code Playgroud)

也按预期工作.

那么条件(三元)运算符又如何呢?

Zab*_*bba 18

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

def reflection
  false ? true : (return false)
end
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

引用规范草案中的一些信息:

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

注意表达式和语句之间的差异在于表达式通常在需要其值的情况下使用,但通常在不一定需要其值的情况下使用语句.但是,也有一些例外.例如,jump-expression(参见11.5.2.4)没有值,可以使用compound-statement的最后一个语句的值.

NB.在上文中,跳跃表达包括return其中.


Mat*_*ick 6

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

  • ruby解析return为三元运算符的else-expression
  • 当红宝石发现false而不是发现时,它会感到惊讶end
  • return false在括号中包装会导致ruby将整个事物解释为else-expression
  • return(false)不起作用,因为ruby仍然试图将该return部分解释为else-expression,并且当它找到左括号(更新)时会感到惊讶

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

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