• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby中proc和lambda的return区别

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

学习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)

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
linux系统的ruby安装ZT发布时间:2022-07-14
下一篇:
ruby中rsa加密加签以及md5、hash加密以及des加解密方法整理发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap