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
这可以按照您的意愿工作,因为它恰好与其他语法规则相匹配.我听说有一些限制是为了支持诗歌模式.
| 归档时间: |
|
| 查看次数: |
2795 次 |
| 最近记录: |