Ruby: fusion de variables dans une chaîne


95

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

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

« Le animal actionla second_animal»

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

Réponses:


240

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

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

Notez les doubles guillemets (") entourant la chaîne: c'est le déclencheur pour Ruby d'utiliser sa substitution d'espace réservé intégrée. Vous ne pouvez pas les remplacer par des guillemets simples (') ou la chaîne sera conservée telle quelle.


2
Désolé, j'ai peut-être trop simplifié le problème. La chaîne sera extraite d'une base de données et la variable dépendra d'un certain nombre de facteurs. Normalement, j'utiliserais un remplacement pour 1 ou deux variables, mais cela a le potentiel d'être plus. Des pensées?
FearMediocrity

La construction # {} est probablement la plus rapide (bien que cela me semble encore contre-intuitif). En plus de la suggestion de gix, vous pouvez également assembler des chaînes avec + ou <<, mais il peut y avoir des chaînes intermédiaires créées, ce qui est coûteux.
Mike Woodhouse

Meilleur moyen d'interpoler les variables
Dragutescu Alexandru

115

Vous pouvez utiliser une mise en forme de type sprintf pour injecter des valeurs dans la chaîne. Pour cela, la chaîne doit inclure des espaces réservés. Mettez vos arguments dans un tableau et utilisez l'une de ces méthodes: (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 spécifier explicitement le numéro d'argument et les mélanger:

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

Ou spécifiez l'argument à l'aide de 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 à l' %opérateur. Par exemple, vous ne pouvez pas éviter de définir animal.


18

J'utiliserais le #{}constructeur, comme indiqué par les autres réponses. Je tiens également à souligner qu'il y a ici une vraie subtilité à surveiller ici:

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 démontrent les variables first_nameet last_name, le #{}constructeur ne peut être utilisé que dans les chaînes avec des guillemets doubles.


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

est une autre façon de le faire.


10

C'est ce qu'on appelle l'interpolation de chaîne, et vous le faites comme ceci:

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

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

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

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

Merci d'utiliser le terme approprié pour que les nouveaux programmeurs puissent apprendre: interpolation.
Mike Bethany

3

Le système de modèles 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"

0

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 chien lèche l' oiseau "

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.