从外部方法调用ruby循环上的next

equ*_*nt8 11 ruby

在Ruby中,很容易告诉循环转到下一个项目

(1..10).each do |a|
  next if a.even?
  puts a
end
Run Code Online (Sandbox Code Playgroud)

result =>

1
3   
5
7
9
Run Code Online (Sandbox Code Playgroud)

但是如果我需要从循环外部调用next(例如:method)怎么办?

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
Run Code Online (Sandbox Code Playgroud)

唯一的解决方案我找到并且工作是在SO问题中使用throw&catch喜欢如何在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
Run Code Online (Sandbox Code Playgroud)

我的问题是:任何人都有更多的琐事解决方案吗?或者throw/catch只是这样做的方法?

另外,如果我my_complex_method不仅要调用该循环的一部分(=>不抛出:跳过),我能以某种方式告诉我的方法它是从循环中调用的吗?

Mur*_*foX 12

你复杂的方法可以返回一个布尔值,然后你在你的循环上进行比较,如下所示:

def my_complex_method(item)
  true if item.even? 
end

(1..10).each do |a|
  next if my_complex_method(a)
  puts a
end
Run Code Online (Sandbox Code Playgroud)

一个简单的方法,但不同于try catch一个.

UPDATE

由于item.even?已经返回一个布尔值,您不需要该true if item.even?部分,您可以执行以下操作:

def my_complex_method(item)
  item.even? 
end
Run Code Online (Sandbox Code Playgroud)