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 animal
action
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?
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.
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
.
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.
["The", animal, action, "the", second_animal].join(" ")
est une autre façon de le faire.
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}'
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"
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"