在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
学习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)
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论