2010-08-19 28 views
15

Qual è il modo migliore idiomatico (più pulito) per convertire una serie di stringhe in una stringa, mantenendo le virgolette racchiuse per ciascun elemento.
In altre parole, da questo:Appiattisci una serie di stringhe in Ruby

a = ["file 1.txt", "file 2.txt", "file 3.txt"] 

avrei bisogno di ottenere questo

"'file 1.txt' 'file 2.txt' 'file 3.txt'" 

singole e doppie virgolette potrebbero essere scambiati qui. Il modo migliore che conosco è usare la mappa e iniettare/ridurre.

es: a.map{|dir| "'" + dir + "'"}.join(' ')
eg2: a.reduce("'"){|acc, dir| acc += dir+"' "}

Rappresentazione potrebbe essere migliorata evitando creazione stringa temp (+ operatore). Questa non è la mia domanda principale però. C'è un modo più pulito e conciso per ottenere lo stesso risultato?

+0

Avete bisogno di fuggire tra virgolette i membri di matrice? –

+0

No, solo per mantenere le virgolette di inizio e fine come mostrato sopra per l'array. Mi rendo conto che le virgolette mostrate non sono nelle stringhe stesse ed è per questo che vengono tolte quando si esegue solo un join sull'array. – Alkaline

risposta

27

Shorter non sempre significa più semplice. Il tuo primo esempio era succinto, leggibile e facilmente modificabile, senza essere inutilmente complesso.

a.map { |s| "'#{s}'" }.join(' ') 
13

Prova

"'#{a.join("' '")}'" 

O se il golf

?'+a*"' '"+?' 
+1

Tutte quelle citazioni sono pignoli, ma la risposta migliore è la migliore finora. – Alkaline

+3

Non sto dicendo che questo sia male, ma non è esattamente leggibile naturalmente. È il genere di cosa che farà diventare anche un Rubyista esperto "Huh?" a prima vista. – Chuck

+0

Interessante golf putt! – captainpete

1

Prova questa:

"'" + a.join("' '") + "'" 
0
"'"+a*"' '"+"'" 

o

"'#{a*"' '"}'" 

o

a.to_s[1...-1].gsub /",?/,"'" 
Problemi correlati