web-dev-qa-db-fra.com

Ruby: Fusion de variables dans une chaîne

Je cherche un meilleur moyen de fusionner des variables dans une chaîne, en Ruby.

Par exemple, si la chaîne ressemble à quelque chose comme:

"La animalaction le second_animal"

Et j'ai des variables pour animal, action et second_animal, quelle est la manière préférée de mettre ces variables dans la chaîne?

86
FearMediocrity

La manière idiomatique est d'écrire quelque chose comme ceci:

"The #{animal} #{action} the #{second_animal}"

Notez les guillemets doubles (") entourant la chaîne: c’est le déclencheur de l’utilisation par Ruby de sa substitution d’espace réservé. Vous ne pouvez pas les remplacer par des guillemets simples ('), sinon la chaîne sera conservée telle quelle.

224
Mike Woodhouse

Vous pouvez utiliser un formatage de type sprintf pour injecter des valeurs dans la chaîne. Pour cela, la chaîne doit inclure des espaces réservés. Placez vos arguments dans un tableau et utilisez l'une des méthodes suivantes: (Pour plus d'informations, consultez la documentation de Kernel :: sprintf .)

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

Vous pouvez même explicitement spécifier le nombre d'arguments et les mélanger:

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

Ou spécifiez l'argument en utilisant des clés de hachage:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

Notez que vous devez fournir une valeur pour tous les arguments de l'opérateur %. Par exemple, vous ne pouvez pas éviter de définir animal.

104
gix

Je voudrais utiliser le constructeur #{}, comme indiqué par les autres réponses ..__ Je tiens également à souligner qu'il existe une réelle subtilité ici à surveiller:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

Bien que les chaînes puissent être créées avec des guillemets simples (comme le montrent les variables first_name et last_name, le constructeur #{} ne peut être utilisé que dans des chaînes avec des guillemets doubles.

15
Starkers
["The", animal, action, "the", second_animal].join(" ")

est une autre façon de le faire.

13
Andrew Grimm

Cela s'appelle une interpolation de chaîne, et vous le faites comme ceci:

"The #{animal} #{action} the #{second_animal}"

Important: cela ne fonctionnera que si la chaîne est entre guillemets doubles ("").

Exemple de code qui ne fonctionnera pas comme prévu:

'The #{animal} #{action} the #{second_animal}'
8
sqrcompass

Le système de modèle ERB standard peut fonctionner pour votre scénario.

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"
3
Clint Pachl

Vous pouvez l'utiliser avec vos variables locales, comme ceci:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

le résultat serait: "Le Chienlèche la Oiseau"