2009-04-29 5 views
18

ho un array in questo modo:Ruby: Come posso unire elementi di un array con un prefisso?

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

desidero tornare una stringa contenente ogni elemento dell'array preceduto da una stringa specificata, poi unite tra loro da un'altra stringa specificata. Ad esempio,

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

dovrebbe comportare

# => %marblecake__%also__%the__%1337 

Come potrei fare questo?

risposta

38

Se l'array è in a allora questo one-liner lo farà

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

Si potrebbe facilmente mettere questo in una funzione della propria - anche aggiungerlo alla classe Array in modo che si può chiamare su un array, come nel tuo esempio.

Si noti che il '!' la versione della mappa (map!) modificherà la matrice in posizione, forse non le tue intenzioni.

+12

Perché si utilizza il distruttivo, sul posto versione di "mappa"? A seconda di come appare il codice dell'OP, potrebbero verificarsi effetti collaterali indesiderati. –

+0

Questo ha fatto il trucco. Grazie mille, Cody. –

+0

Jason: solo le primitive/stringhe vengono archiviate qui. C'è un'alternativa che consiglieresti? –

2

Come per il suggerimento di cui sopra:

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

Questo presuppone che tu stia cercando di unirti a un array di stringhe - se avessi una matrice di numeri interi per esempio di quella "+ e" fallirebbe in quanto il "+" non è implementato per stringa + numero intero. Un approccio migliore sarebbe quello di eseguire la concatenazione di stringhe in una stringa con doppia quotatura con un'interpolazione di stringa "# {e}" che implicitamente con_s il tuo elemento, quindi: self.collect {| e | "# {prefisso} # {e}"} .join (separatore) È più flessibile. –

+0

O potresti semplicemente fare 'prefix.to_s + e.to_s' – rampion

-1

ero alla ricerca di una soluzione a questo today.I pensa che questa question.This era la mia soluzione.

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

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

Sfortunatamente questo funziona solo con array di stringhe. –

10

Anche se questo è molto vecchia questione, vorrei aggiungere questo:

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

Questa è una soluzione intelligente! Mi piace molto :) –

+0

se 'a' è vuoto allora restituirà'% 'solo – xiaoboa