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