【问题标题】:Builtin Ruby or ActiveSupport function for "select first n elements satisfying a predicate"?用于“选择满足谓词的前 n 个元素”的内置 Ruby 或 ActiveSupport 函数?
【发布时间】:2016-12-21 03:43:33
【问题描述】:

我正在寻找一个select,一旦它返回一定数量的项目就会“短路”:

>>> [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),因为该块可能有副作用。

【问题讨论】:

  • 你担心什么样的副作用?

标签: ruby activesupport


【解决方案1】:

你可以做一些类似的事情

[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}

【讨论】:

  • 如果你使用first(n)而不是take(n)你可以取消to_a
  • 第二个例子我相信你的意思是arr.count 因为x 是一个Fixnum 并且没有count 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多