gpt4 book ai didi

ruby - 重试语句在 Ruby 中如何工作?

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:25 25 4
gpt4 key购买 nike

我刚刚开始使用 Ruby,但我所遵循的手册似乎已经过时了。我一直在做一些研究,但一直找不到明确的答案。

手册在一个应该充当循环的方法中使用了“retry”关键字,但它没有使用开始/救援 block ,当你强制将“retry”关键字放在里面时,行为看起来很不一样开始/救援 block 。

我试过很多东西:-第一个是在方法开始时使用“begin”关键字,在重试点使用“raise”,然后是相应的“rescue”;重试;结尾;'。-最后一个是在外面使用'begin/rescue' block ,包装方法的调用。

按照手册中的逻辑,只有最后一个可以正常工作。

有一些例子:

手册中的代码如下:

def WHILE(cond)
return if not cond
yield
retry
end
i=0; WHILE(i<3) {print i; i+=1}

结果:012

我试过以下方法:

def WHILE(cond)
begin
return if not cond
yield
raise
rescue
retry
end
end
i=0; WHILE(i<3) {print i; i+=1}

结果:无限数

def WHILE(cond)
return if not cond
yield
end
i=0; begin; WHILE(i<3) {print i; i+=1}; raise; rescue; retry; end

结果:012 (加上一个明显的无限循环什么都不打印)

我希望你能让我摆脱这种存在主义的怀疑,但这是我的结论。

在强制使用“retry”关键字的 begin/rescue block 之前,它可能会以一种不再适用的方式使用,重复调用方法,尽管在该方法中

现在,它只是跳转到“开始”语句。

但我不确定这一点,我需要确认。如果是这样,是否有任何形式可以恢复这种使用?

谢谢。

最佳答案

你的 WHILE不像普通的 while因为在你的情况下i<3在调用时计算一次while语句每次都对其求值。

如果你想写一个while同等重要的是,您的条件是可以评估的,而不是已经评估的。

您可以通过接受 Proc 作为条件来解决这个问题:

def so_long_as(cond)
loop do
return unless cond.call

yield
end
end

然后你这样调用它:

i = 0
so_long_as(-> { i < 3 }) do
print i
i += 1
end

现在打印 012 的地方并正确终止。

需要注意的重要一点是 retry仅适用于 begin/end上下文,而不是常规方法,现在您必须使用 redo相反:

i = 0
redone = false
so_long_as(-> { i < 3 }) do
print i
unless (redone)
redone = true
redo
end
i += 1
end

打印 0012 的地方现在。

some significant changes to how redo and retry work值得一读。

关于ruby - 重试语句在 Ruby 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045153/

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