新手问题 proc 中的 return

ane · 2014年01月06日 · 最后由 u1378130755 回复于 2014年01月06日 · 2472 次阅读

有时候会这样写代码

def test1
  puts "start test"
  p= Proc.new { puts "hello test" ; return} // lambda {puts "hello test";return}也是可以的。
  p.call
  puts "end test"
end
test

我记得好像在书中有说过,ruby 是解释性语言,边解释边执行。那么在解释“p= Proc.new { puts "hello test" ; return}”的时候,也就执行了 return,为什么还可以继续执行 p.call?难道是我对 return 的理解不够吗?

还有一种是将“Proc.new { puts "hello test" ; return} ”包装到另一个方法

def procbuilder( )
  Proc.new { puts "hello test" ; return}
end
p=procbuilder( )

这两种方式,有何异同了?还请高手详解

要用 block 里返回值要用 next,不是 return。

2 楼 已删除

#2 楼 @piecehealth 那为什么“p= Proc.new { puts "hello test" ; return} ”这个可以

#3 楼 @u1378130755 这只是建了一个 Proc 对象,没执行 return,直到 call 了才会执行。

#3 楼 @u1378130755 p.call 是在这个 block 的作用域里执行 block 里面的代码,p 的作用域跟 test1 方法的作用域相同,所以里面的 return 跟在方法里 return 一样的。

#3 楼 @u1378130755 p.call 是在这个 block 的作用域里执行 block 里面的代码,p 的作用域跟 test1 方法的作用域相同,所以里面的 return 跟在方法里 return 一样的。

鼠标不好用……经常风怒

#4 楼 @piecehealth “p=procbuilder( )”会将最后一行返回,不就是给 p 赋值 Proc.new { puts "hello test" ; return}吗?然后再 p.call,感觉也 OK 啊

#7 楼 @piecehealth “p 的作用域跟 test1 方法的作用域相同,所以里面的 return 跟在方法里 return 一样的。”这点,我同意。鼠标不行就换

#8 楼 @u1378130755 这段代码跟p = Proc.new { puts "hello test" ; return}等价,有什么问题么?

#10 楼 @piecehealth 如果我刚才测试代码没有写错的话“p = Proc.new { puts "hello test" ; return}”这样写是 OK 的,但“p=procbuilder( )”会报错。用的 ruby2.0

需要 登录 后方可回复, 如果你还没有账号请 注册新账号