【问题标题】:Is there an equivalent to "continue" (python) in rebol?rebol 中是否有等效于“继续”(python)的方法?
【发布时间】:2013-09-07 13:36:23
【问题描述】:

我正在将一些 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 在那之后做了一些改进?

【问题讨论】:

    标签: python rebol


    【解决方案1】:

    你可以在 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 以避免捕捉其他异常。甚至可以覆盖迭代器以透明地为您执行此操作,但会降低一些性能。

    【讨论】:

    • /name 的改进不是那么明显,它在一些 RTFM 之后起作用,但是: ` continue: do [throw/name 'continue 'keepgoing] repeat i 10 [ catch/name [ prin i if ( i = 5) [继续] prin i ] keepgoing ] ` 返回: 112233445667788991010 ,正如预期的那样。 – 皮埃尔 5 分钟前
    【解决方案2】:

    CONTINUE 不在 Rebol2 中。但它在 Rebol3 中并且运行良好:

    loop 2 [
        print {"This'll print", {HostileFork} said.}
        continue
        print {"This won't print", {HostileFork} said.}
    ]
    

    你会得到输出:

    “这会打印出来”,{HostileFork} 说。
    “这会打印出来”,{HostileFork} 说。

    据我所知,没有办法在 Rebol2 中实现 continue。

    好的,基于@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。

    【讨论】:

      【解决方案3】:

      在 R2 LOOP 1 中也可以工作,开销比 CATCH 少

      loop 1 [
          print {"This'll print", {DocKimbel} said.}
          break
          print {"This won't print", {DocKimbel} said.}
          ]
      

      【讨论】:

      • 是的,但这并不像我希望的那样,就像 python 那样: continue 不会跳出循环,它会继续循环的下一次迭代。
      猜你喜欢
      • 2019-09-12
      • 2018-07-19
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多