Proc & lambda 2

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)

你可能感兴趣的:(lambda,proc)