内置 Ruby 或 "select first n elements satisfying a predicate" 的 ActiveSupport 函数?
Builtin Ruby or ActiveSupport function for "select first n elements satisfying a predicate"?
我正在寻找一个select
,一旦返回一定数量的项目,"short-circuits":
>>> [1, 2, 3, 4, 5].select_first(1) { |x| x.odd? }
[1]
>>> [1, 2, 3, 4, 5].select_first(2) { |x| x.odd? }
[1, 3]
>>> [1, 2, 3, 4, 5].select_first(1000) { |x| x.odd? }
[1, 3, 5]
核心或 ActiveSupport 中是否有库函数可以执行此操作?自己动手很容易,但我想我会检查一下。
请注意,我不想要 select { ... }.take(n)
因为该块可能有副作用。
你可以按照
的方式做一些事情
[1, 2, 3, 4, 5].lazy.select{|x| x.odd? }.take(n).to_a
但是如果你想避免 select{ . . }.take(n)
你也可以这样做:
[1, 2, 3, 4, 5].each{|x| arr << x if x.odd?; break if arr.count == n}
我正在寻找一个select
,一旦返回一定数量的项目,"short-circuits":
>>> [1, 2, 3, 4, 5].select_first(1) { |x| x.odd? }
[1]
>>> [1, 2, 3, 4, 5].select_first(2) { |x| x.odd? }
[1, 3]
>>> [1, 2, 3, 4, 5].select_first(1000) { |x| x.odd? }
[1, 3, 5]
核心或 ActiveSupport 中是否有库函数可以执行此操作?自己动手很容易,但我想我会检查一下。
请注意,我不想要 select { ... }.take(n)
因为该块可能有副作用。
你可以按照
的方式做一些事情[1, 2, 3, 4, 5].lazy.select{|x| x.odd? }.take(n).to_a
但是如果你想避免 select{ . . }.take(n)
你也可以这样做:
[1, 2, 3, 4, 5].each{|x| arr << x if x.odd?; break if arr.count == n}