2010-03-25 28 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

相關問題