Ruby 如何编写自己的循环?
我正在练习我的Ruby元编程,并尝试编写自己的循环方法,该方法将处理侦听套接字时的大部分问题,但让程序员有机会指定循环中断条件以及在每个IO.select/sleep周期后要执行的一组操作 我想写的东西是这样的: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
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中都会很难看。