学习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 {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 { 10 } double(p)

ruby中proc和lambda的return区别的更多相关文章

  1. Ruby中的语句中断和返回

    李哲 - APRIL 28, 2015 return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一 ...

  2. ruby中Block, Proc 和 Lambda 浅析

    Block 与Proc的区别: Block是代码块,Proc是对象: 参数列表中最多只能有一个Block, 但是可以有多个Proc或Lambda; Block可以看成是Proc的一个类实例. Proc ...

  3. Ruby中Block, Proc, 和Lambda

    Block Blocks就是存放一些可以被执行的代码的块,通常用do...end 或者 {}表示 例如: [1, 2, 3].each do |num| puts num end [1, 2, 3]. ...

  4. Ruby Proc 和 lambda的共同点和区别

    Proc 和 lambda 的目的是把block {....} 变成类似方法一样的对象,使其不需要重复编写同样的block. Proc 和 lambda 的共同点: 语法类似Proc.new{|n| ...

  5. [翻译]理解Ruby中的blocks,Procs和lambda

    原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...

  6. ruby中的可调用对象--proc和lamdba

    ruby中将块转变成对象的三种方法 ruby中的大部分东西都是对象,但是块不是.那么,如果你想存下来一个块,方便以后使用,你就需要一个对象.ruby中有三种方法,把块转换成可以利用的对象. Proc. ...

  7. c语言exit和return区别,在fork和vfork中使用

    转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...

  8. iOS中break、continue、return三者的区别

    iOS中break.continue.return三者的区别 1. break         直接跳出当前层次的循环. 如果嵌套循环如for中嵌套while,break只能跳出内层的while循环, ...

  9. Ruby中访问控制符public,private,protected区别总结

    重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...

随机推荐

  1. PHP基础示例:商品信息管理系统v1.1[转]

      实现目标:使用php和mysql写一个商品信息管理系统,并带有购物车功能 一.创建数据库和表 1.创建数据库和表:demodb 2.创建表格:goods 字段:商品编号,商品名称,商品类型,商品图 ...

  2. android 高效加载大图

    在写代码的时候就已经解释: /** * 计算samplesize的大小 * @param options 传一个BitmapFactory.Options 进去获取图片的大小和类型 * @param ...

  3. OpenCV是什么?

    OpenCV其实就是一对C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法.例如C借口函数cvCanny()实现了Canny边缘提取算法.可以直接将这些源代码添加到我们自己的项 ...

  4. supervisor安装配置与使用

    supervisor:C/S架构的进程控制系统,可使用户在类UNIX系统中监控.管理进程.常用于管理与某个用户或项目相关的进程. 组成部分supervisord:服务守护进程supervisorctl ...

  5. Asp.Net异步导入Excel

    故事:用户在页面上传一个excel文件,程序把excel里的内容入库. 技术方案:保存文件在服务器,jquey Ajax 异步读取文件中的记录到数据库,在页面实时刷新导入情况 页面前端 <%@ ...

  6. Multiply game_线段树

    Problem Description Tired of playing computer games, alpc23 is planning to play a game on numbers. B ...

  7. java项目部署在服务器环境配置以及命令的编写

    在往项目上部署java项目(即打成的jar包),要为相应的项目配置环境变量,即项目运行所需要的jar或其他第三方的jar包,java -cp derivativeAccording.jar:lib/c ...

  8. Welcome to LED Control Wiki

    About this project This project was developed after I had to find out that controlling my RGB ambien ...

  9. Xcode中使用debug模式和release模式

    在开发过程中,我们经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程.但是一个发布的程序,里面带有太多的NSLog输 ...

  10. xml json protobuf

    本文为原创,转载请注明:http://www.cnblogs.com/gistao/ Background xml,json,protobuf都是格式化手段,喜欢哪个,会用哪个,该用哪个,用哪个? 随 ...