我怎样才能从积木中尽早归还东西?


90

如果我想做这样的事情:

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

   ..many lines of code here..
end

我将如何获得这种效果?我知道我可以将所有内容包装在一个大的if语句中,但是如果可能的话,我想避免嵌套。

休息就不会在这里工作,因为我希望停止其余元素的迭代。

Answers:


176

next块内部返回该块。break块中的内容从产生该块的函数返回。因为each这意味着break退出循环并next跳转到循环的下一个迭代(即名称)。您可以使用next value和返回值break value


53
+1的next valuebreak value。正是我想要的。
约书亚·品特

1
break value没有为我工作,但next value工作得很好。非常感谢。
Francesco Belladonna 2013年

4
我不确定您对next和break的定义是否正确。至少,它们令人困惑。break退出最里面的循环,下一步将您移至下一个迭代。来源:tutorialspoint.com/ruby/ruby_loops.htm
WattsInABox 2013年

3
@WattsInABoxnextbreak不以任何方式向特定循环结构,所以你链接的文章很误导(因为它在很大程度上意味着对面)。而且,我的描述在块中使用next和时绝对是正确的break(请注意,while并且for在Ruby中很少使用,即使有过使用,所以next和的使用率有99%break在块内)。
sepp2k 2013年

我认为您的意思是非循环块。这就是令人困惑的地方。另外,我不同意您的99%主张,但这是不同的说法。
WattsInABox

11
#!/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}"

5

在这种情况下,可以使用break提前终止循环:

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

...当然,这是假设您实际上并不想返回一个值,只是打破常规。


这不仅会从块返回,还会从每个块返回。因此循环将结束,而不是继续下一个值。不确定那是预期的。
sepp2k 2010年

4
您可以使用一个值break在Ruby中-break 5会导致each返回5
查克

1
谢谢,但是我不想停止迭代。
ryeguy 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.