【发布时间】:2026-02-16 10:00:01
【问题描述】:
在 Ruby 中,很容易告诉循环转到下一项
(1..10).each do |a|
next if a.even?
puts a
end
结果 =>
1
3
5
7
9
但是如果我需要从循环外部调用 next 怎么办(例如:方法)
def my_complex_method(item)
next if item.even? # this will obviously fail
end
(1..10).each do |a|
my_complex_method(a)
puts a
end
我找到并有效的唯一解决方案是使用throw 和catch 就像在SO 问题How to break outer cycle in Ruby? 中一样
def my_complex_method(item)
throw(:skip) if item.even?
end
(1..10).each do |a|
catch(:skip) do
my_complex_method(a)
puts a
end
end
我的问题是:任何人有任何更漂亮的解决方案来做到这一点?或者是throw/catch 唯一的方法吗??
如果我不仅想调用 my_complex_method 作为该循环的一部分(=> 不要抛出 :skip),我还能以某种方式告诉我的方法它是从循环中调用的吗?
【问题讨论】:
-
你真的,真的在想这个。返回一个值并根据返回值有条件地调用
next。这是软件中难以置信常见的模式,几乎适用于我曾经使用过的所有语言。throw/catch这里没有位置。 -
我同意这个例子很荒谬,但我有一个需要分离循环和方法的案例
标签: ruby