为什么a = b rescue stmt是错误但stmt rescue stmt不是?

Loh*_* MV 3 ruby syntax syntax-error

我无法确定以下ruby内联救援代码的错误

def test_check()
p  "first st"
t = 5 * lsdj rescue return false
p "second"
end

p test_check
Run Code Online (Sandbox Code Playgroud)

这是一个错误消息, syntax error, unexpected kFALSE, expecting kEND 但如果我删除赋值语句,它将正常工作(返回false).

 def test_check()
    p  "first st"
     5 * lsdj rescue return false
    p "second"
    end
Run Code Online (Sandbox Code Playgroud)

如果出现问题,在ruby中进行内联救援的正确语法是什么.

Dig*_*oss 12

当内联rescue在赋值1,2中使用时,它不会将语句作为参数- 它只需要一个表达式的值来获取它的情况.

但要小心,你认为这会回归什么?

def q
  return 5 * lsdj rescue false
  true
end
Run Code Online (Sandbox Code Playgroud)

不是假的,它返回true.这样做是为了让救援仅适用于表达.

def q
  return (5 * lsdj rescue false)
  true
end
Run Code Online (Sandbox Code Playgroud)

这个返回false.


笔记.
这实际上是一个非常好的问题.重申:
      为什么 a = b rescue stmt 是一个错误但 stmt rescue stmt 不是?
并且表面上的答案是,在赋值情况下,rhs和rescue语句是ruby语法中的arg非终结符而不是完整语句,而在语句中,语法只是在救援之后解析完整的stmt规则.这就是它的定义方式.现在,如果你那么问为什么?......好吧...... Ruby的复杂语法生活在yacc(1)能够的边缘.在我看来,在许多情况下,Matz详细说明了在某些情况下接受的确切内容,而不仅仅是使用像expr这样的单个非终端,我想其原因是保持语法LALR(1)和限制不可避免的转移/减少冲突到可容忍的空间.查看 Ruby源代码中的parse.y以获得有趣的读物.
2.这是一个例子:def q; (t = 5 * lsdj) rescue return false; true; end
这可以按照您的意愿工作,因为它恰好与其他语法规则相匹配.我听说有一些限制是为了支持诗歌模式.