2017-05-31 2 views
0

Ich versuche, ein Array wiemit zwei eindeutigen Einträgen für jeden Eintrag von einem anderen Array in Ruby Erstellen von Array

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

und es in

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

ich das tun habe zu nehmen versucht, folgende:

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

was nicht was macht finde ich es tun sollte. Ich bekomme:

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

Ich möchte:

First.Package.ads 
First.Package.adb 
Second.Package.ads 
Second.Package.adb 
+1

Ein anderer Ansatz 'arr.flat_map {| str | [str + ". ads", str + ". adb"]} ' –

Antwort

4

package << ".ads mutiert Zustand der Verpackung. Verwenden Sie + für Zeichenfolge Verkettung an solchen Stellen, da es Status nicht mutiert. Es gibt nur eine neue Zeichenfolge zurück (was Sie wirklich wollen).

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

sollte

+0

... und um' files = [] 'und' return files' zu entfernen, schreiben 'packages.each_with_object (dateien) do | package, files |' gefolgt durch was du hast. –

+0

Sie können hier auch 'push' verwenden, das mehrere Argumente benötigt, wie' files.push (package + ".ads", package + ".adb") '. Ob es besser ist, bin ich mir nicht sicher. –

+2

Das Problem ist, dass zusätzlicher Code geschrieben werden muss, wenn eine zusätzliche Erweiterung hinzugefügt wird. Stattdessen sollte der Code nicht kümmern. –

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"] 

Hinweis für Ihren Fall arbeiten, dass

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

Array#product See.

+1

Das ist cool und du bekommst mein upvote, aber kartesisches Produkt auf Dateinamen zu verwenden ist vielleicht ein wenig zu schlau für einige Teams ... –

+2

würde ich damit gehen. Es funktioniert, wenn 'packages' oder' suffixes' neue Elemente bekommen, ohne mehr Code schreiben zu müssen. –

3

Bei

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

Sie es so tun könnte:

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

Verwenden Sie 'flat_map' anstelle der äußeren' map'. Dies wird Ihnen ersparen, am Ende "flattern" zu müssen –

Verwandte Themen