我怎样才能从一个街区提前归还一些东西?
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 value
和break value
返回值。
【讨论】:
break value
对我不起作用,而 next value
工作正常。非常感谢。
我不确定您对 next 和 break 的定义是否正确。至少,它们令人困惑。 break 退出最里面的循环, next 将您移动到下一个迭代。来源:tutorialspoint.com/ruby/ruby_loops.htm
@WattsInABox next
和 break
绝不是特定于循环结构的,因此您链接的文章非常具有误导性(因为它在很大程度上暗示了相反的意思)。当 next
和 break
在块内使用时,我的描述绝对正确(请注意,while
和 for
在 Ruby 中很少使用,如果有的话,所以 99% 的使用 next
和 break
在块内)。
我认为你的意思是非循环块。这就是令人困惑的地方。另外,我不同意你 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"
【讨论】:
以上是关于我怎样才能从一个街区提前归还一些东西?的主要内容,如果未能解决你的问题,请参考以下文章