如何从块中提早返回?

rye*_*guy 81 ruby

如果我想做这样的事情:

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

   ..many lines of code here..
end
Run Code Online (Sandbox Code Playgroud)

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

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

sep*_*p2k 160

next块内部从块返回.break块内部从返回块的函数返回.对于each这意味着break退出循环并next跳转到循环(因此名称)的下一次迭代.您可以使用next value和返回值break value.

  • +1为"下一个值"和"中断值".正是我在寻找什么. (44认同)
  • 我不确定你对next和break的定义是否正确.至少,他们很困惑.break退出最内层循环,然后移动到下一个迭代.来源:http://www.tutorialspoint.com/ruby/ruby_loops.htm (4认同)
  • @WattsInABox`next`和`break`绝不是特定于循环结构的,因此你链接的文章非常具有误导性(因为它强烈暗示相反).当在块内使用`next`和`break`时,我的描述肯定是正确的(注意`while`和`for`很少,如果有的话,在Ruby中使用,所以99%的使用`next`和`break`在块内). (3认同)
  • “中断值”对我不起作用,而“下一个值”则工作正常。多谢。 (2认同)

JD.*_*JD. 10

#!/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}"
Run Code Online (Sandbox Code Playgroud)


Sni*_*gus 5

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

collection.each do |i|
  break if i == 3
  ...many lines
end
Run Code Online (Sandbox Code Playgroud)

...当然,这假设你实际上并没有想要返回一个值,只是突破了一个块.

  • 您可以在Ruby中使用带有"break"的值 - "break 5"将导致`each`返回5. (3认同)