gpt4 book ai didi

ruby - 为什么 a = b rescue stmt 是一个错误,而 stmt rescue stmt 不是?

转载 作者:数据小太阳 更新时间:2023-10-29 07:41:43 26 4
gpt4 key购买 nike

我无法确定以下 ruby​​ 内联救援代码有什么问题

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

p test_check

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

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

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

最佳答案

内联 rescue 在赋值中使用时不将语句作为参数1,2 -- 它只需要表达式的值如果它被救出。

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

def q
return 5 * lsdj rescue false
true
end

不是false,它返回true。改为这样做,以便救援仅适用于表达式。

def q
return (5 * lsdj rescue false)
true
end

这个返回false。


注意事项。
1.这实际上是一个非常好的问题。重述:
为什么 a = b rescue stmt 一个错误但是 stmt rescue stmt 不是吗?
表面上的答案是,在赋值情况下,rhs 和 rescue 语句在 ruby​​ 语法中是 arg 非终结符,而不是完整的语句,而在语句中如果语法在救援后简单地解析完整的 stmt 规则。这只是它的定义方式。现在,如果你问 那是为什么? ... 好吧 ... Ruby 的复杂语法处在 yacc(1) 的边缘。 有能力。在我看来,在许多情况下,Matz 都详细说明了在某些情况下可以接受的内容,而不是仅仅使用像 expr 这样的单个非终结符,我想原因是为了保持语法 LALR(1) 并限制不可避免的shift/reduce conflicts到可容忍的空间。 <强> Check out parse.y 在 Ruby 源代码分发中进行有趣的阅读。
2.下面是一个例子:def q; (t = 5 * lsdj) 救援返回假;真的; end
这如你所愿,因为它恰好匹配其他语法规则。我听说存在其中一些限制以支持诗歌模式。

关于ruby - 为什么 a = b rescue stmt 是一个错误,而 stmt rescue stmt 不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15117523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com