2011-08-04 20 views

回答

4

的方法,期望的显式参数cond,并且该“状态”被假定为一个lambda/PROC(假设是通过依靠cond.call成功制造),并已被传递给方法my_while明确。 &语法通过将其隐式转换为一个Proc对象(see 'The ampersand')来捕获变量中的方法块(如果存在)。

块不是Ruby中的真实对象,因此必须使用&符号语法进行转换。一旦块被绑定到一个Proc,你可以像在任何其他proc/lambda上一样发送call消息。

->语法是lambda的简写,它将块转换为Proc对象(显式地)。使用lambda和Proc.new也有一点区别。再次,wikibook:

实际上,lambda和Proc.new之间有两个细微的差异。

首先,参数检查。用于lambda状态的Ruby文档:等同于Proc.new,除了生成的Proc对象检查调用时传递的参数数量。

其次,从Proc处理退货的方式有所不同。从Proc.new的返回从封闭方法返回(作用就像从一个块的返回,更稍后):

def try_ret_procnew 
    ret = Proc.new { return "Baaam" } 
    ret.call 
    "This is not reached" 
end 

# prints "Baaam" 
puts try_ret_procnew 

虽然从拉姆达返回作用更常规地,返回到它的调用者:光

def try_ret_lambda 
    ret = lambda { return "Baaam" } 
    ret.call 
    "This is printed" 
end 

# prints "This is printed" 
puts try_ret_lambda 

有了这个,我会建议使用lambda代替Proc.new,除非后者的行为是严格要求。除了更酷的两个字符更短,其行为并不令人惊讶。

+0

所以拉姆达使用只是为了能够通过cond.call称它为方法内 –

+1

是 - 第一个参数'cond'是明确的,并有望成为“通知”,而'&block'是一个隐含参数,捕获该方法的块。 – emboss

2

该片-> { a < 3 }是一个lambda术语的快捷方式(它是在wi红宝石1.9)。这是传递给您的方法的第一个参数(即cond),而之后的块分配给body。 lambda然后通过cond.call在您的方法内执行。