首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Proc & lambda 二

2012-09-06 
Proc & lambda 2Proc与lambda的区别有两个?一、返回时机不同?def double(callable_object)puts callable_ob

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)

热点排行