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?

PeurMédiocrité
la source

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.

Mike Woodhouse
la source
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.

gix
la source
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.

Nu comme un ver
la source
13
["The", animal, action, "the", second_animal].join(" ")

est une autre façon de le faire.

Andrew Grimm
la source
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}'
sqrcompass
la source
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"
Clint Pachl
la source
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 "

Níkolas La Porta
la source