2010-03-12 9 views
30

j'ai 4 variables de chaîne name, quest, favorite_color, speed qui pourraient être vides. Je veux les concaténer tous ensemble, en mettant des espaces entre ceux qui ne sont pas vides. La simplicité du code, c'est-à-dire combien il est simple de regarder et de comprendre, est plus importante que la vitesse.Ruby concaténer des chaînes et ajouter des espaces

Alors:

name = 'Tim' 
quest = 'destroy' 
favorite_color = 'red' 
speed = 'fast' 

devient

'Tim destroy red fast' 

et

name = 'Steve' 
quest = '' 
favorite_color = '' 
speed = 'slow' 

devient:

'Steve slow' 

Notez qu'il n'y a qu'un espace entre 'Steve' et 'lent'.

Comment puis-je faire (de préférence en 1 ligne)?

Répondre

67
[name, quest, favorite_color, speed].reject(&:empty?).join(' ') 
+1

Quand je teste cela, je reçois l'erreur suivante: « Erreur sur la ligne 5: mauvais type d'argument Symbole (Proc prévu) » Qu'est-ce que je manque? –

+0

Vous utilisez probablement Ruby <1.8.7. Essayez '[nom, quête, couleur_préférée, vitesse] .rejet {| s | s.empty?}. join ('') ' –

+0

Quelle version de Ruby? Pourrait également essayer: [nom, quest, favorite_color, speed] .reject {| s | s.empty?}. join ('') –

5

Vous pouvez utiliser inject:

[name,quest,favorite_color,speed].inject("") {|k,v| v.empty? ? k : k << " " << v }.strip 
+0

+1 pour une réponse de travail, bien qu'il soit moins facile à lire (et donc l'entretien) que les autres. –

+0

Vous avez raison sur tous les points. La réponse d'Aaron est meilleure. –

18

Essayez [name,quest,favorite_color,speed].join(' ').squeeze(' ')

+1

celui-ci semble plus simple. – Allyn

+0

C'est aussi le plus rapide. – ghoppe

+0

Cela ne fera que retirer des espaces. Mais s'il y a des espaces dans la chaîne individuelle, je ne peux pas les enlever. –

Questions connexes