代码之家  ›  专栏  ›  技术社区  ›  Dmitry Dmitriev

Ruby loop via lambda,如何打破?

  •  1
  • Dmitry Dmitriev  · 技术社区  · 7 年前

    可以创建 dead loop 在ruby中使用lambdas:

    a = 0
    lambda = ->{ a += 1; puts "#{a}"; sleep 1}
    loop &lambda
    p a
    

    现在我在寻找一种方法 break 这种循环由 lambda 转入区块 。我尝试的两种明显的方法都没有完成一个循环,它们只是从lambda中退出,但循环仍然有效:

    打破 不停止循环:

    a = 0
    lambda = ->{ a += 1; puts "#{a} break"; sleep 1; break; p "This line will not appears"}
    loop &lambda
    p a
    

    return 不要停止循环:

    a = 0
    lambda = ->{ a += 1; puts "#{a} return"; sleep 1; return; p "This line will not appears"}
    loop &lambda
    p a
    

    如果我使用 proc 而不是 兰姆达 我能够 回来 退出循环,但我也退出程序:

    a = 0
    prc_ = Proc.new{a += 1; puts "#{a} proc return"; sleep 1; return; p "This line will not appears"}
    loop &prc_
    p a
    

    当我使用 打破 在…内 过程 ,我只是放弃了 LocalJumpError 例外

    a = 0
    prc_ = Proc.new{a += 1; puts "#{a} proc break"; sleep 1; break; p "This line will not appears"}
    loop &prc_
    p a
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   mrzasa    7 年前

    你可以提高 StopIteration lambda例外:

    a = 0
    lambda = ->{ a += 1; puts "#{a}"; sleep 1; raise StopIteration if a>10}
    loop &lambda
    p a
    

    Docs 表示:

    loop() public 重复执行块。 如果没有给定块,则返回枚举数。 (…) 停止迭代 方块中的凸起打破了循环。