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)