从外部方法调用ruby循环的下一步
在Ruby中,很容易告诉loop转到下一项从外部方法调用ruby循环的下一步,ruby,Ruby,在Ruby中,很容易告诉loop转到下一项 (1..10).each do |a| next if a.even? puts a end 结果=> 1 3 5 7 9 但是如果我需要从循环外部调用next(例如:method),该怎么办 我找到的唯一有效的解决办法就是像上面提到的那样使用throw&catch 我的问题是:有谁有更漂亮的解决方案来做到这一点吗??或者抛出/捕获是唯一的方法吗 另外,如果我想调用我的\u complex\u方法而不仅仅是作为循环的一部分(=>不要抛
(1..10).each do |a|
next if a.even?
puts a
end
结果=>
1
3
5
7
9
但是如果我需要从循环外部调用next(例如:method),该怎么办
我找到的唯一有效的解决办法就是像上面提到的那样使用throw
&catch
我的问题是:有谁有更漂亮的解决方案来做到这一点吗??或者抛出/捕获是唯一的方法吗
另外,如果我想调用我的\u complex\u方法
而不仅仅是作为循环的一部分(=>不要抛出:skip),我能告诉我的方法它是从循环调用的吗?你的complex方法可以返回一个布尔值,然后在循环上进行如下比较:
def my_complex_method(item)
true if item.even?
end
(1..10).each do |a|
next if my_complex_method(a)
puts a
end
一种简单的方法,但不同于try-catch方法
更新
由于item.event?
已返回布尔值,因此不需要true if item.event?
部分,您可以执行以下操作:
def my_complex_method(item)
item.even?
end
而且是goo的好选择:
def my_complex_method(e)
return if e.peek.even?
p e.peek
end
enum = (1..5).each
enum.size.times do |a|
my_complex_method(enum)
enum.next
end
输出
1
3
5
如果您只需要对其中一些值采取操作,则可以根据my_complex_方法返回的值
明智地使用枚举器:
(1..10).map { |a| [a, my_complex_method(a)] }.each do |a, success|
puts a if success
end
您可以定义方法接受块,并在此块中根据成功或失败执行某些操作:
(1..10)。每个都有|
我的|复杂|方法{|成功|下一个如果成功}
结束
多亏了作用域,您不能使用'catch`/'throw`,并且可以根据处理状态调用'next'。您真的,真的想得太多了。返回一个值并根据返回的值有条件地调用next
。这是软件中非常常见的模式,几乎在我使用过的每种语言中都是如此<代码>抛出
/捕获
在这里没有位置。我同意这个例子很荒谬,但我有一个例子,我需要分离循环和方法,因为我可以看出第一个方法不起作用-下一个
没有传递给每个啊,你是对的--下一步
这里指的是在我的复杂方法
中定义的收益率……我会选择这个答案,因为它让我意识到在我的真实代码中,我的复杂方法
可以以不同的方式编写,所以这可以实现(以及Meagar对我的问题的评论)。。。但如果有人需要使用我在qestion中描述的功能,我会选择使用而不是我的throw/catch
解决方案
1
3
5
(1..10).map { |a| [a, my_complex_method(a)] }.each do |a, success|
puts a if success
end