ruby中proc和lambda的return区别

Posted 学者先要会疑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于ruby中proc和lambda的return区别的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:将proc转换为lambda?

ruby Ruby Proc,Lambda和Closure

在 Rails 模型验证中使用哪个更好:Proc 还是 lambda? [关闭]

Ruby - lambda 与 Proc.new [重复]

使用 lambda 在单个实例上重新定义单个 ruby​​ 方法

ruby proc_return.rb