Ruby中,next,break,return在block中的使用

http://blog.csdn.net/lslxdx/article/details/11489419

1、next

[ruby] view plain copy
 
  1. def m1  
  2.   puts"m1 begin"  
  3.   m2 do  
  4.     puts"block begin"  
  5.     next#next的作用是中断本block的执行,跳至它的调用方法(本例中是m2)中  
  6.     puts"block end"  
  7.   end  
  8.   puts"m1 end"  
  9. end  
  10.   
  11. def m2  
  12.   puts"m2 begin"  
  13.   yield  
  14.   puts"m2 end"  
  15. end  
  16.   
  17. m1  


输出:

[plain] view plain copy
 
  1. m1 begin  
  2. m2 begin  
  3. block begin  
  4. m2 end  
  5. m1 end  

 

2、break

[ruby] view plain copy
 
  1. def m1  
  2.   puts"m1 begin"  
  3.   m2 do  
  4.     puts"block begin"  
  5.     break#break的作用是中断本block的调用方法(本例中是m2)的执行,跳至调用“本block的调用方法”的方法(本例中是m1)中  
  6.     puts"block end"  
  7.   end  
  8.   puts"m1 end"  
  9. end  
  10.   
  11. def m2  
  12.   puts"m2 begin"  
  13.   yield  
  14.   puts"m2 end"  
  15. end  
  16.   
  17. m1  

输出:

[plain] view plain copy
 
  1. m1 begin  
  2. m2 begin  
  3. block begin  
  4. m1 end  

 

3、return

[ruby] view plain copy
 
  1. def m1  
  2.   puts"m1 begin"  
  3.   m2 do  
  4.     puts"block begin"  
  5.     return#return的作用是中断“调用'本block的调用方法'的方法(本例中是m1)”  
  6.     puts"block end"  
  7.   end  
  8.   puts"m1 end"  
  9. end  
  10.   
  11. def m2  
  12.   puts"m2 begin"  
  13.   yield  
  14.   puts"m2 end"  
  15. end  
  16.   
  17. m1  

输出:

[plain] view plain copy
 
  1. m1 begin  
  2. m2 begin  
  3. block begin  


另外,需要对return进行补充说明下:我认为return更准确的作用是“跳出‘定义它的作用域’”,与‘调用它(的时候)的作用域’无关。(P.S:我的理解是对的,可以参见《Ruby元编程》中文版的P90)

下面是<Programming Ruby (Second Edition)> P343 的英文描述:

[plain] view plain copy
 
  1. A <strong>return</strong> from inside a <em>block</em> that's still in scope acts as return from that scope.  
  2.   
  3. 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个例子,第一个成功,剩下的两个报错:

一个成功的例子:

[ruby] view plain copy
 
  1. def meth1  
  2.   (1..10).each do |val|  
  3.     return val #returns from method  
  4.   end  
  5. end  
  6. meth1 #->1  

一个失败的例子,因为这个block的上下文已经不存在了:

[ruby] view plain copy
 
  1. def meth2(&b)  
  2.   b  
  3. end  
  4. res = meth2{return}  
  5. res.call #unexpected return (LocalJumpError)  

又一个失败的例子,因为block的创建线程和调用线程不同:

[ruby] view plain copy
 
  1. def meth3  
  2.   yield  
  3. end  
  4. t = Thread.new do  
  5.   meth3 {return} #return can't jump across threads (ThreadError)  
  6. end  
  7. t.join  

 

 

最后是我写的一个调用失败的例子:

[ruby] view plain copy
 
    1. def m1(&b)  
    2.   m2 &b  
    3. end  
    4.   
    5. def m2  
    6.   yield  
    7. end  
    8.   
    9. m1{return;} #unexpected return (LocalJumpError)  
posted on 2017-07-17 17:46  guolongnv  阅读(276)  评论(0)    收藏  举报