从编程红宝石摘自1.9书:为什么这种方法拉姆达的参数,它是如何工作的
def my_while(cond, &body)
while cond.call
body.call
end
end
a=0
my_while -> { a < 3 } do
puts a
a += 1
end
生产:
从编程红宝石摘自1.9书:为什么这种方法拉姆达的参数,它是如何工作的
def my_while(cond, &body)
while cond.call
body.call
end
end
a=0
my_while -> { a < 3 } do
puts a
a += 1
end
生产:
的方法,期望的显式参数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,除非后者的行为是严格要求。除了更酷的两个字符更短,其行为并不令人惊讶。
该片-> { a < 3 }
是一个lambda术语的快捷方式(它是在wi红宝石1.9)。这是传递给您的方法的第一个参数(即cond
),而之后的块分配给body
。 lambda然后通过cond.call
在您的方法内执行。
所以拉姆达使用只是为了能够通过cond.call称它为方法内 –
是 - 第一个参数'cond'是明确的,并有望成为“通知”,而'&block'是一个隐含参数,捕获该方法的块。 – emboss