Ruby 如何编写自己的循环?

Ruby 如何编写自己的循环?,ruby,metaprogramming,Ruby,Metaprogramming,我正在练习我的Ruby元编程,并尝试编写自己的循环方法,该方法将处理侦听套接字时的大部分问题,但让程序员有机会指定循环中断条件以及在每个IO.select/sleep周期后要执行的一组操作 我想写的东西是这样的: x = 1 while_listening_until( x == 0 ) do x = rand(10) puts x end 我所能做的是: def while_listening_until( params, &block ) break_cond = p

我正在练习我的Ruby元编程,并尝试编写自己的循环方法,该方法将处理侦听套接字时的大部分问题,但让程序员有机会指定循环中断条件以及在每个IO.select/sleep周期后要执行的一组操作

我想写的东西是这样的:

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

杰出的谢谢。matz在设计Ruby时,分析了Smalltalk和Lisp标准库,发现绝大多数高阶过程只接受一个过程参数。因此,他增加了对采用块形式的单个过程参数的方法的专门支持。然而,在编写自己的控制结构时,这种假设并不成立,因为它们通常至少包含两个过程参数:条件和主体。这就是为什么
if
while
case
和friends都是关键词而不是方法的原因:否则,它们在所有lambda中都会很难看。