zoukankan      html  css  js  c++  java
  • ruby中proc和lambda的return区别

    学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了

    一下内容部分来自<<ruby元编程>>第二版92页

    1 lambda中的return表示仅仅才从,这个lambda中返回,那么从lambda中返回到底是啥意思呢.

    l = lambda {return 10}
    

    我的理解是,你正常考虑代码快执行 l被赋值成10,而且return的影响范围仅仅在大括号里面.并没有影响其他的代码 例如

    def test
      l = -> { return 10 }
      l.call + 20
    end
    
    p test # 30
    

    上面代码 return 10 这里执行时,并没有导致函数执行结束,return仅仅在大括号里起作用

    2 proc中的return行为则不同,从定义proc作用域返回 ,那么这句话什么意思呢 .我们如何理解

    def test
      l = proc { return 10 }
      return l.call + 20
    end
    

    上面的代码换成了 proc ,我们可以这样理解 ,先把 l = proc{}这些部分去掉 变成如下

     

    def test
       return 10 
      return l.call + 20
    end
    

    很明显.我们包含了2个return语句,那么 第二个肯定不执行了.这就是proc里面的return造成的, 它的作用范围超过了大括号,

    此时test方法就是prco定义的作用域,return直接相当于test方法的return

    那我们我们看下面代码究竟错在哪里

    # frozen_string_literal: true
    
    def double(callable_object)
      callable_object.call * 2
    end
    
    p = proc.new {return 10 } #in `block in <main>': unexpected return (LocalJumpError)
    
    double(p)
    

    上面 报错位置什么会报错,如果你按照我上面讲的.暂时先把 p = proc {return 10} 中的 除了return 10以外暂时删除掉.代码变成下面

    # frozen_string_literal: true
    
    def double(callable_object)
      callable_object.call * 2
    end
    
    return 10 
    
    double(p)

     那么你发现,单独写这么一行return 10肯定报错,都不知道返回到哪里去 

    不过书中讲了,可是不使用return,来规避这个问题,代码如下,可以解决

    # frozen_string_literal: true
    
    def double(callable_object)
      callable_object.call * 2
    end
    
    p = proc.new { 10 }
    
    double(p)
    

  • 相关阅读:
    flex自适应小例子
    hasOwnProperty 递归 简单回调 链式调用
    H5音频和视频
    html特殊字符
    css巧妙实现分隔线
    SQL Server中数据的存储
    SQL高级查询
    SQL SERVER查询到的数据转为Json格式
    SQL动态生成列
    SQL合并查询数据,以逗号分隔
  • 原文地址:https://www.cnblogs.com/or2-/p/5969356.html
Copyright © 2011-2022 走看看