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 {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)
时间: 2024-10-15 09:21:52

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

ruby 中each, map和collect的区别

map and collect are the same, they return an array constructed as the result of calling the block for each item in the array. irb(main):002:0> [1,2,3,4].collect {|n| n*2} => [2, 4, 6, 8] irb(main):003:0> [1,2,3,4].map {|n| n*2} => [2, 4, 6, 8]

Ruby中的语句中断和返回

`return`,`break`,`next` 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意. ***return*** 常用方式 通常情况下的`return`语句和大家理解的意思是相同的. ```Rupy def m1 param if param == 1 return 'returned 1' end 'returned default value'#根据Ruby语言规范,最后一条执行语句的结

Ruby Proc 和 lambda的共同点和区别

Proc 和 lambda 的共同点: 语法类似Proc.new{|n| n**2} lambda{|n| n**2} 都可以用.call方法调用 hello_proc = Proc.new{ puts "Hello!" }hello_proc.call #Hello!hello_lambda = lambda{ puts "Hello!" }hello_lambda.call #Hello! 都可以用&关键字把各自转换为blocknums = [1,3,4

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

重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this class”, 但是Ruby中意为 “private to this instance”.意思是:C++中,对于类A,只要能访问类A,就能访问A的对象的private方法.Ruby中,却不行:你只能在你本对象的实例中访问本对象的private方法.因为Ruby的原则是“private意为你不能指定方法接收

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

c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返回一值,可以写为return(0),或return 0. 1. return返回函数值,是关键字:exit是一个函数. 2. return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它表示了一个进程的结束. 3. retu

jQuery中preventDefault()、stopPropagation()、return false 之间的区别

一.preventDefault()方法,阻止浏览器默认行为 浏览器有很多默认行为,比如form表单的submit按钮一点击,默认行为就要开始提交表单. 再比如 <a href="http://www.klmai.cn">内部优惠券</a> a链接一点击默认触发的行为就是浏览器地址栏变化后跳转到指定的网站.要阻止这种默认行为我们可以用preventDefault()方法.实例如下: <div class="div1"> 阻止浏览器

ruby中的作用域和代码块

ruby中没有嵌套的作用域,它的作用域之间是分开的,一旦进入一个新作用域,原先的绑定就会被替换为一组新的绑定. 作用域门 一般来说,程序会在三个地方关闭前一个作用域,同时找开一个新的作用域. 它们分别是:class.module.def,它们被称为作用域门.class/module与def还有一点微妙的差别.在类或module中的代码会被立即执行.相反,方法中的代码只有在方法被调用的时候才执行. 扁平化作用域 my_var = "abc" class MyClass def my_me

Ruby 中的闭包-代码块

看了一片文章https://ruby-china.org/topics/38385讲closure的. 写下一些感想: 闭包就是 一个函数能够记住和存取它的lexical作用域,即使这个函数是在它的lexical作用域的外面执行. 当一个函数被写出来时,这个函数的closure就已经确定了. javascript中有闭包的概念:https://www.cnblogs.com/chentianwei/p/9739714.html Ruby中的关键字定义def是没有闭包的.它创建一个封闭的作用域.

ruby中的可调用对象--方法

上一篇讲了ruby中的可调用对象proc和lambda,他们都是块转换成的对象.ruby中的可调用对象还有方法.通过使用method方法,并且以方法名作为参数(字符串或者符号),就可以得到一个方法对象. 如下: 1 class C 2 def talk 3 p "hello world" 4 end 5 end 6 7 c = C.new 8 meth = c.method :talk 9 meth.call 输出: "hello world" 类C有个实例方法ta