在Ruby中,是否有一个数组方法将‘select’和‘map’结合起来?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我有一个包含一些字符串值的Ruby数组。我需要:

  • 找到与某些谓词相匹配的所有元素
  • 通过转换运行匹配元素
  • 以数组形式返回结果

现在我的解决方案如下所示:

def example
  matchingLines = @lines.select{ |line| ... }
  results = matchingLines.map{ |line| ... }
  return results.uniq.sort
end

是否有一个数组或枚举方法将select和map组合为一个逻辑语句?

提问于
用户回答回答于

我通常使用mapcompact我的选择标准一起作为if的后缀。

jruby-1.5.0 > [1,1,1,2,3,4].map{|n| n*3 if n==1}    
 => [3, 3, 3, nil, nil, nil] 


jruby-1.5.0 > [1,1,1,2,3,4].map{|n| n*3 if n==1}.compact
 => [3, 3, 3] 
用户回答回答于

你可以使用reduce,只需要一次传递:

[1,1,1,2,3,4].reduce([]) { |a, n| a.push(n*3) if n==1; a }
=> [3, 3, 3] 

换句话说,将状态初始化为你想要的状态(在我们的例子中是一个空的列表来填充[]),然后总是确保返回该值并对原始列表中的每个元素进行修改。

这是最有效率的,因为它只通过一遍(map+ selectcompact需要两遍)遍历列表。

在你的情况下:

def example
  results = @lines.reduce([]) do |lines, line|
    lines.push( ...(line) ) if ...
    lines
  end
  return results.uniq.sort
end

扫码关注云+社区