我怎样才能从一个街区提前归还一些东西?

Posted

技术标签:

【中文标题】我怎样才能从一个街区提前归还一些东西?【英文标题】:How can I return something early from a block? 【发布时间】:2011-01-31 20:43:10 【问题描述】:

如果我想做这样的事情:

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

   ..many lines of code here..
end

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

Break 在这里不起作用,因为我确实想停止剩余元素的迭代。

【问题讨论】:

【参考方案1】:

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

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

...当然,这是假设您实际上并不想返回一个值,只是跳出块。

【讨论】:

这不仅会从块返回,还会从每个块返回。所以循环将结束,而不是继续下一个值。不确定那是什么意思。 您可以在 Ruby 中使用带有 break 的值 — break 5 将导致 each 返回 5。 谢谢,但我不想停止迭代。【参考方案2】:

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

【讨论】:

break value 对我不起作用,而 next value 工作正常。非常感谢。 我不确定您对 next 和 break 的定义是否正确。至少,它们令人困惑。 break 退出最里面的循环, next 将您移动到下一个迭代。来源:tutorialspoint.com/ruby/ruby_loops.htm @WattsInABox nextbreak 绝不是特定于循环结构的,因此您链接的文章非常具有误导性(因为它在很大程度上暗示了相反的意思)。当 nextbreak 在块内使用时,我的描述绝对正确(请注意,whilefor 在 Ruby 中很少使用,如果有的话,所以 99% 的使用 nextbreak在块内)。 我认为你的意思是非循环块。这就是令人困惑的地方。另外,我不同意你 99% 的说法,但这是一个不同的论点。 我一直在寻找 Array 类的特定方法,因为我已经习惯了 .detect、.map、.reduce 之类的好东西。当我找不到类似的东西时,我知道我错过了一些明显的东西。谢谢。【参考方案3】:
#!/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"

【讨论】:

以上是关于我怎样才能从一个街区提前归还一些东西?的主要内容,如果未能解决你的问题,请参考以下文章

24期分期免息可以提前还吗?

我怎样才能获得 Skyscanner API? [关闭]

如何从 rake 任务中提前返回?

我怎样才能把它压缩成一个 For 循环?

我怎样才能让这个 Flutter Bloc 发送更新?

从 Android Studio 中的 URL 解析 XML