为Ruby中另一个数组的每个条目创建两个唯一条目的数组

时间:2017-05-31 20:20:06

标签: arrays ruby

我试图采用类似

的数组
[ "First.Package", "Second.Package" ]

并将其转换为

[ "First.Package.ads", "First.Package.adb", "Second.Package.ads", "Second.Package.adb" ]

我尝试过以下操作:

packages = [ "First.Package", "Second.Package" ]
files = []
packages.each do |package|
    files << (package << ".ads")
    files << (package << ".adb")
end
return files

我不认为应该这样做。我明白了:

First.Package.ads.adb
First.Package.ads.adb
Second.Package.ads.adb
Second.Package.ads.adb

我想:

First.Package.ads
First.Package.adb
Second.Package.ads
Second.Package.adb

3 个答案:

答案 0 :(得分:5)

packages = ["First.Package", "Second.Package"]
suffixes = [".ads", ".adb"]

packages.product(suffixes).map(&:join)
  #=> ["First.Package.ads", "First.Package.adb",
  #    "Second.Package.ads", "Second.Package.adb"]

请注意

packages.product(suffixes)
  #=> [["First.Package", ".ads"], ["First.Package", ".adb"],
  #    ["Second.Package", ".ads"], ["Second.Package", ".adb"]]

请参阅Array#product

答案 1 :(得分:4)

package << ".ads改变了包的状态。在这样的地方使用+进行字符串连接,因为它不会改变状态。它只返回新的字符串(这是你真正想要的)。

packages.each do |package|
    files << (package + ".ads")
    files << (package + ".adb")
end

这应该适合您的情况

答案 2 :(得分:3)

给出

packages = %w(First.Package Second.Package)
extensions = %w(.ads .adb)

你可以这样做:

files = packages.map do |package|
  extensions.map do |extension|
    package + extension
  end
end.flatten