2009-04-29 9 views
18

Ich habe ein Array wie folgt:Ruby: Wie verbinde ich Elemente eines Arrays mit einem Präfix?

["marblecake", "also", "the", 1337] 

Ich möchte einen String zurück erhalten, die jedes Element des Arrays durch eine spezifizierte Zeichenfolge voran enthält, dann miteinander verbunden durch eine andere angegebene Zeichenfolge. Zum Beispiel

["marblecake", "also", "the", 1337].join_with_prefix("%", "__") 

sollte

# => %marblecake__%also__%the__%1337 

in

führen Wie könnte ich das tun?

Antwort

38

Wenn Ihr Array in a ist dann dieser Einzeiler wird es tun

a.map { |k| "%#{k}" }.join("_") 

Sie einfach dieses in Abhängigkeit von Ihrer eigenen setzen könnte - auch an die Array Klasse hinzufügen, so dass Sie es nennen können auf einem Array, wie in Ihrem Beispiel.

Beachten Sie, dass das '!' Version der Karte (map!) wird das Array an Ort und Stelle ändern - vielleicht nicht Ihre Absicht.

+12

Warum verwenden Sie die zerstörerische, in-place-Version von "Karte"? Abhängig davon, wie der OP-Code aussieht, kann dies unbeabsichtigte Nebenwirkungen haben. –

+0

Das hat den Trick gemacht. Vielen Dank, Cody. –

+0

Jason: Hier werden nur Primitive/Strings gespeichert. Gibt es eine Alternative, die du empfehlen würdest? –

2

Gemäß der oben Vorschlag:

class Array 
    def join_with_prefix(prefix,separator) 
    self.collect {|e| prefix.to_s + e }.join(separator) 
    end 
end 

p ['ab','cd','ef'].join_with_prefix('%','__') 
=> "%ab__%cd__%ef"
+2

Dies setzt voraus, dass Sie versuchen, einem Array von Strings beizutreten - wenn Sie beispielsweise ein Array mit ganzen Zahlen hätten, würde der "+ e" -Teil fehlschlagen, da dort das "+" nicht implementiert ist Zeichenfolge + Ganzzahl Ein besserer Ansatz wäre, die String-Verkettung in einer Zeichenfolge mit doppelten Anführungszeichen mit einer String-Interpolation "# {e}" durchzuführen, die implizit zu Ihrem Element führt: self.collect {| e | "# {Präfix} # {e}"} .join (Trennzeichen) Es ist flexibler. –

+0

Oder Sie könnten einfach 'prefix.to_s + e.to_s' machen – rampion

-1

ich nach einer Lösung für dieses today.I Suche fanden diese question.This meine Lösung war.

array = ["marblecake", "also", "the", 1337]; 
arrayString = '' 

array.each{|x| arrayString += "%" + x + "__"} 
+0

Leider funktioniert das nur mit Arrays von Strings. –

10

Obwohl diese sehr alte Frage ist, würde Ich mag diese hinzufügen:

a.any? && "%".+(a.join("__%")) 
+0

Das ist eine clevere Lösung! Ich mag das sehr gerne :) –

+0

Wenn 'a' leer ist, wird nur '%' zurückgegeben – xiaoboa

Verwandte Themen