2010-03-25 61 views
65

如果我想要做这样的事情:如何从一个区块提前返回某些内容?

collection.each do |i| 
    return nil if i == 3 

    ..many lines of code here.. 
end 

我怎么会得到这种效果?我知道我可以在一个大的if语句中将所有内容都包裹起来,但是如果可能的话我想避免嵌套。

休息不会在这里工作,因为我做不是想停止迭代其余元素。

回答

132

next块内返回块。 break块内返回从块产生的功能。对于each这意味着break退出循环,并且next跳转到循环的下一个迭代(因此名称)。您可以使用next valuebreak value返回值。

+1

'next'是我一直在寻找的,谢谢。 – ryeguy 2010-03-25 18:39:42

+32

用于“下一个值”和“中断值”。正是我在找什么。 – 2012-11-30 20:41:47

+1

'break value'对我不起作用,而'next value'工作正常。非常感谢。 – 2013-09-21 15:10:30

5

在这种情况下,你可以使用break来终止循环早期:

collection.each do |i| 
    break if i == 3 
    ...many lines 
end 

......当然,这是假设你没有真正打算返回一个值,只是打出来的该块。

+0

这不只是从块返回,它会从每个返回。所以循环会结束,而不是继续下一个值。不知道这是什么意图。 – sepp2k 2010-03-25 18:17:09

+3

你可以在Ruby中使用'break'的值 - 'break 5'会导致'each'返回5. – Chuck 2010-03-25 18:21:05

+1

谢谢,但我不想停止迭代。 – ryeguy 2010-03-25 18:34:16

8
#!/usr/bin/ruby 

collection = [1, 2, 3, 4, 5 ] 

stopped_at = collection.each do |i| 
    break i if i == 3 

    puts "Processed #{i}" 
end 

puts "Stopped at and did not process #{stopped_at}" 
+0

谢谢@jd,在减少方面效果很好。 – Joe 2017-07-26 16:06:31

相关问题