ChatGPT解决这个技术问题 Extra ChatGPT

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

如果我想做这样的事情:

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

   ..many lines of code here..
end

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

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


s
sepp2k

块内的 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 这样的好东西。当我找不到类似的东西时,我知道我错过了一些明显的东西。谢谢。
J
JD.
#!/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}"

S
Sniggerfardimungus

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

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

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


这不仅会从块返回,还会从每个块返回。所以循环将结束,而不是继续下一个值。不确定这是否是预期的。
您可以在 Ruby 中使用带有 break 的值 — break 5 将导致 each 返回 5。
谢谢,但我不想停止迭代。