Block、Proc 与 Lambda的区别

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 unpacked

lambda实例:


 可以看到参数个数必须严格按照lamdba的定义,否则报错
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容