我正在将一些python代码转换为rebol,我只是遇到了一条“继续”指令。它会中断循环的处理,进入循环的下一次迭代。
我发现这个词非常优雅和可读。
我在那里遇到了一些答案:(用法语),但没有什么真正“优雅”: http://pl.legoff.free.fr/dotclear/vf/index.php/post/2003/01/05/Equivalent-d-un-Continue-ou-Next-dans-une-bouc 由于这种对流大约有10年的历史,因此Rebol可能会有一些改进吗?
答案 0 :(得分:6)
您可以使用例外在Rebol2中执行此操作:
continue: does [throw 'continue]
loop 2 [
catch [
print {"This'll print", {DocKimbel} said.}
continue
print {"This won't print", {DocKimbel} said.}
]
]
如果您要在循环中处理自定义异常,可以使用 / name 细化,如 catch / name [...]'continue 以避免抓住其他例外。甚至可以覆盖迭代器来为您透明地执行它,但代价是一些较慢的性能。
答案 1 :(得分:4)
CONTINUE不在Rebol2中。但它在Rebol3中运行得很好:
loop 2 [
print {"This'll print", {HostileFork} said.}
continue
print {"This won't print", {HostileFork} said.}
]
你会得到输出:
“这打印”,{HostileFork}说 “这打印”,{HostileFork}说。
据我所知,没有办法在Rebol2中实现一个继续。
好的,基于@ DocKimbel的回答,你可以在Rebol2中做到这一点:
old-loop: :loop
loop: func [count [integer!] block [block!]] [
old-loop count [catch block]
]
continue: does [throw 'continue]
loop 2 [
print {"This'll print", {HostileFork} said.}
continue
print {"This won't print", {HostileFork} said.}
]
注意:BREAK和CONTINUE的内部实现方法确实使用与Rebol中的THROW相同的机制...它相对轻量级而不是异常处理。重要的是要知道THROW 不你应该用什么来表示错误...而现代的Rebol构建(Ren/C)甚至不允许你抛出一个。你应该改用FAIL。
答案 2 :(得分:3)
在R2中,LOOP 1的工作量也比CATCH
少loop 1 [
print {"This'll print", {DocKimbel} said.}
break
print {"This won't print", {DocKimbel} said.}
]