美文网首页
Block、Proc 与 Lambda的区别

Block、Proc 与 Lambda的区别

作者: 见贤思齐 | 来源:发表于2015-06-07 21:48 被阅读0次

    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的定义,否则报错

    相关文章

      网友评论

          本文标题:Block、Proc 与 Lambda的区别

          本文链接:https://www.haomeiwen.com/subject/vwzdqttx.html