Proc & lambda 2
Proc与lambda的区别有两个
?
一、返回时机不同
?
def double(callable_object) puts callable_object.class callable_object.call * 2end?
#例1
#lambda 只从lambda中返回
?
lamb = lambda {return 10}puts double(lamb)?#例2
#而proc,除了从proc中返回以外,还会在proc定义的时候返回
#所以在下面的例子中,当执行到p.call时,程序返回10,而不会 返回10 * 2
?
p = Proc.new { return 10}puts double(p)?# unexpected return (LocalJumpError)
?
#解决办法就是再proc中不要使用 return
?
p = Proc.new { 10 }puts double(p)?#例3
?
def double1 p = Proc.new { return 10} puts p.class return p.call * 2endputs double1?#例3不会抛出异常,是为什么呢?
#在例2中,当执行double(p)的时候,scope(作用域)会发生改变,当一个程序
#不能再顶层域(top-level)返回时,就会抛出异常
#而在例3中,只有一个域(top-level), 即使proc返回结果,也是没有问题的
?
二、参数要求不同
?
#在proc中,如果参数多了,它会自动去掉多余的参数,如果不够则用nil代替
#在lambda中,传递的参数必须与定义的参数个数相同,否则抛出异常
?
p1 = Proc.new{|a, b| puts a, b}p1.call(1,2,3) #1,2p1.call(1) #1,nil?
p2 = Proc.new {|x,*y| p x, y }p2.call(1,2,3) #1,[2.3]?
lamb1 = lambda {|a,b| puts a, b}lamb1.call(1,2,3)?#wrong number of arguments (3 for 2) (ArgumentError)