`
renzhen
  • 浏览: 248131 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ruby中的break,next关键字

阅读更多
break,next是Ruby里面对循环控制的两个关键字,使用break可以退出循环,和Java的同名关键字的含义相同,next类似于Java中的continue,跳到下一个循环中,而Ruby中大量使用block进行迭代,其中也可以用这两个关键字进行循环的跳转,是我一度误以为这两个关键字在这两种情况下是一样的。
直到我一天翻看《Programing Ruby》中关于next和break在block的作用时,我才发现原来这两个是不一样的,书中说:next只会退出这个block作用域,而break则是退出block所在的方法,于是我做了如下的实验测试一下这两个关键字在block的行为。
def expmeth
  count=0
  while count<3
  count+=1
   puts "before in while block #{count-1}" #1
   yield count-1
   puts "after in while block #{count-1}" #2
 end
 
 puts "out while block" #3
end

expmeth{|i| 

puts "block #{i}"
break if i==1
}

执行结果:
before in while block 0
block 0
after in while block 0
before in while block 1
block 1
可见,block中执行break后,语句直接退出方法,2,3语句都没有执行。
将上述代码中break换成next,继续执行,得到的结果:
before in while block 0
block 0
after in while block 0
before in while block 1
block 1
after in while block 1
before in while block 2
block 2
after in while block 2
out while block
可见,block中执行next后,只是退出block本身,而不是退出本次循环,所以2语句得到了执行。
在一些方法中,位置3的语句经常有一些资源释放的语句,如何保证这个语句一定能执行而不受block中的break影响呢,这个很简单,可以通过begin...ensure...end,将语句放入ensure快中,就可以保证资源的释放了,即使你可以确保执行的代码一定不会出现异常(这也不可能,因为没法保证block不出现异常 )。


分享到:
评论
1 楼 orcl_zhang 2011-09-13  
next故名思意,“下一个循环”

相关推荐

Global site tag (gtag.js) - Google Analytics