Ruby的Block块是它的关键特色之一,用块能够写出简明且高度可重用的算法。我们也会经常用到,例如:products.map(&:product_name) 这儿我们就传递了一个proc
Block 与Proc的区别:
Block是代码块,Proc是对象;
参数列表中最多只能有一个Block, 但是可以有多个Proc或Lambda;
Block可以看成是Proc的一个类实例.
Proc 与Lambda 区别:
Proc和Lambda都是Proc对象;
Lambda检查参数个数,当传递的参数超过一个时,会报错,而Proc不检查,当传递参数多于一个时,只传递第一个参数,忽略掉其他参数;
1、代码块、procs和lambda中的return语句
在一个代码块中的return语句不仅仅会从你该代码块的迭代器返回,它还会从调用迭代器的方法返回。
下面的exiting method将不会被执行proc与代码块类似,如果调用的proc执行一个return语句,它会试图从代码块所在的方法返回。
proc下面的exiting method将不会被执行但是,lambda中的语句仅仅从lambda自身返回。lamdba后面的语句也会继续执行。
lamdba下面的exiting method执行 lamdba下面的exiting code执行2、break语句
proc中调用break语句,会是该代码块返回到它的迭代器,然后该迭代器再返回到它的调用方法。
proc下面的exiting iterator不会执行lambda中调用break语句,只是从lambda自身返回。
下面例子这种情况下,break和return语句一样。
lamdba下面的exiting test method执行3、顶级的next语句在代码块、proc和lambda中有相同的行为:它使调用代码块、proc和lambda的yield语句或call返回。
redo在proc和lambda中也有相同的行为,它让控制流转向proc和lambda的开始处。
4、传给proc和lambda的参数
调用proc使用的是yield语义,而调用lambda使用的是invocation语义。
proc实例:
多余的参数被忽略,array automatically unpackedlambda实例:
可以看到参数个数必须严格按照lamdba的定义,否则报错
网友评论