如何编写我自己的loop_until?

如何编写我自己的loop_until?

问题描述:

我正在练习我的Ruby元编程,并试图编写我自己的循环方法,它将处理侦听套接字中的大部分丑事,但让程序员有机会指定循环中断条件和一块事情在每个IO.select/sleep循环之后执行。如何编写我自己的loop_until?

我希望能写什么是这样的:

x = 1 
while_listening_until(x == 0) do 
    x = rand(10) 
    puts x 
end 

我已经能够做的工作是:

def while_listening_until(params, &block) 

    break_cond = params[ :condition ] || "false" 
    loop { 
    #other listening things are happening here 
    yield 
    break if params[:binding].eval(break_cond) 
    } 
end 

x = 1 
while_listening_until(:condition => "x==0", :binding => binding()) do 
    x = rand(10) 
    puts x 
end 

那么,如何让我所有的eval和绑定丑陋走开?

这是lambda表达式都得心应手:

def while_listening_until(condition, &block) 
    loop { 
    #other listening things are happening here 
    yield 
    break if condition.call 
    } 
end 

x = 1 
while_listening(lambda{ x == 0 }) do 
    x = rand(10) 
    puts x 
end 
+0

好极了!谢谢。很好,很干净。 – user2221533 2013-05-02 17:13:22

+0

当matz设计Ruby时,他分析了Smalltalk和Lisp标准库,并注意到绝大多数高阶过程只采用* single *过程参数。因此,他增加了对块的形式采用单个过程参数的方法的专门支持。但是,在编写自己的*控制结构时,这个假设并不成立,因为它们通常至少需要两个*过程参数:* condition *和* body *。这就是为什么if,while,case和friends是关键字而不是方法的原因:否则它们会对所有这些lambda表达式都很难看。 – 2013-05-02 18:59:20