Ruby 中是否有 each_if 方法?

5
假设我在 Ruby 中有以下 each 循环。
@list.each { |i|
  puts i

  if i > 10
    break
  end
}

我希望能在列表中循环直到满足条件。

这让我感到不太符合Ruby的风格,因为我是Ruby新手,有没有一种Ruby的方式来实现这个呢?

2个回答

6
你可以使用 Enumerable#detect 或者 Enumerable#take_while,具体取决于你想要的结果。
@list.detect { |i|
  puts i
  i > 10
} # Returns the first element greater than 10, or nil.

正如其他人所指出的,更好的做法是首先进行子选择,然后再对其进行操作,例如:

@list.take_while{ |i| i <= 10 }.each{|i| puts i}

1
也许我太正统了,但是如果将原本用于函数式的“take_while”或“detect”(它们返回结果)用于产生某些副作用,会让我感到有些不安。尽管如此,它们确实可以完成操作者所要求的功能。因此,也许可以这样写:@list.take_while { ... }.each。【编辑】好的,mattexx的回答就是这个。 - tokland
抱歉有点迂腐,但是你通常用四个空格缩进你的Ruby代码吗?算了:注意到原帖作者也在这样做。 - Andrew Grimm

3
您可以使用take_while函数:
@list.take_while { |i| i <= 11 }.each { |i| puts i }

1
但这样做会迭代两次。有没有一种方法可以将条件传递给 each,然后仅在与条件匹配的元素上执行块? - asymmetric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接