在Ruby中,如何在.each循环中跳过一个循环,类似于'continue'

在Ruby中,如何在.each循环中跳过一个循环,类似于其他语言中的continue ?

213477 次浏览

使用next:

(1..10).each do |a|
next if a.even?
puts a
end

打印:

1
3
5
7
9

为了获得额外的凉爽,还可以查看redoretry

也适用于朋友像timesuptodowntoeach_with_indexselectmap和其他迭代器(和更普遍的块)。

更多信息见http://ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL

next -它类似于return,但用于块!(所以你也可以在任何proc/lambda中使用它。)

这意味着你也可以用next n从块中“返回”n。例如:

puts [1, 2, 3].map do |e|
next 42 if e == 2
e
end.inject(&:+)

这将产生46

注意,return 总是从最近的def返回,而不是块;如果周围没有def,则returning是一个错误。

在块中故意使用return可能会令人困惑。例如:

def my_fun
[1, 2, 3].map do |e|
return "Hello." if e == 2
e
end
end

my_fun将导致"Hello.",而不是[1, "Hello.", 2],因为return关键字属于外部def,而不是内部块。