Proc与lambda的区别有两个
一、返回时机不同
def double(callable_object) puts callable_object.class callable_object.call * 2 end
#例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 * 2 end puts 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,2 p1.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)