Ruby中,next,break,return在block中的使用
http://blog.csdn.net/lslxdx/article/details/11489419
1、next
- def m1
- puts"m1 begin"
- m2 do
- puts"block begin"
- next#next的作用是中断本block的执行,跳至它的调用方法(本例中是m2)中
- puts"block end"
- end
- puts"m1 end"
- end
- def m2
- puts"m2 begin"
- yield
- puts"m2 end"
- end
- m1
输出:
- m1 begin
- m2 begin
- block begin
- m2 end
- m1 end
2、break
- def m1
- puts"m1 begin"
- m2 do
- puts"block begin"
- break#break的作用是中断本block的调用方法(本例中是m2)的执行,跳至调用“本block的调用方法”的方法(本例中是m1)中
- puts"block end"
- end
- puts"m1 end"
- end
- def m2
- puts"m2 begin"
- yield
- puts"m2 end"
- end
- m1
输出:
- m1 begin
- m2 begin
- block begin
- m1 end
3、return
- def m1
- puts"m1 begin"
- m2 do
- puts"block begin"
- return#return的作用是中断“调用'本block的调用方法'的方法(本例中是m1)”
- puts"block end"
- end
- puts"m1 end"
- end
- def m2
- puts"m2 begin"
- yield
- puts"m2 end"
- end
- m1
输出:
- m1 begin
- m2 begin
- block begin
另外,需要对return进行补充说明下:我认为return更准确的作用是“跳出‘定义它的作用域’”,与‘调用它(的时候)的作用域’无关。(P.S:我的理解是对的,可以参见《Ruby元编程》中文版的P90)
下面是<Programming Ruby (Second Edition)> P343 的英文描述:
- A <strong>return</strong> from inside a <em>block</em> that's still in scope acts as return from that scope.
- A return from a block whose original context is not longer valid raises an exception(<strong>LocalJumpError</strong> or <strong>ThreadError</strong> depending on the context).
下面是3个例子,第一个成功,剩下的两个报错:
一个成功的例子:
- def meth1
- (1..10).each do |val|
- return val #returns from method
- end
- end
- meth1 #->1
一个失败的例子,因为这个block的上下文已经不存在了:
- def meth2(&b)
- b
- end
- res = meth2{return}
- res.call #unexpected return (LocalJumpError)
又一个失败的例子,因为block的创建线程和调用线程不同:
- def meth3
- yield
- end
- t = Thread.new do
- meth3 {return} #return can't jump across threads (ThreadError)
- end
- t.join
最后是我写的一个调用失败的例子:
- def m1(&b)
- m2 &b
- end
- def m2
- yield
- end
- m1{return;} #unexpected return (LocalJumpError)
好的心态+正确的方法
浙公网安备 33010602011771号