Ruby: unione di variabili in una stringa


95

Sto cercando un modo migliore per unire le variabili in una stringa, in Ruby.

Ad esempio, se la stringa è qualcosa come:

"Il animal actionil second_animal"

E ho variabili per animal, actione second_animalqual è il modo preferito per inserire quelle variabili nella stringa?

Risposte:


240

Il modo idiomatico è scrivere qualcosa del genere:

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

Nota le virgolette doppie (") che circondano la stringa: questo è il trigger per Ruby per utilizzare la sua sostituzione segnaposto incorporata. Non puoi sostituirle con virgolette singole (') o la stringa verrà mantenuta così com'è.


2
Scusa, forse ho semplificato troppo il problema. La stringa verrà estratta da un database e la variabile dipenderà da una serie di fattori. Normalmente userei un sostituto per 1 o due variabili, ma questo ha il potenziale per essere di più. qualche idea?
FearMediocrity

Il costrutto # {} è probabilmente il più veloce (anche se mi sembra ancora controintuitivo). Oltre al suggerimento di gix, puoi anche assemblare stringhe con + o <<, ma potrebbero essere create alcune stringhe intermedie, il che è costoso.
Mike Woodhouse,

Il modo migliore per interpolare le variabili
Dragutescu Alexandru

115

Puoi utilizzare la formattazione simile a sprintf per inserire valori nella stringa. Per questo la stringa deve includere segnaposto. Metti i tuoi argomenti in un array e usa uno di questi modi: (Per maggiori informazioni guarda la documentazione per 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

Puoi anche specificare esplicitamente il numero dell'argomento e mescolarli:

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

Oppure specifica l'argomento usando le chiavi hash:

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

Nota che devi fornire un valore per tutti gli argomenti %all'operatore. Ad esempio, non puoi evitare di definire animal.


18

Userei il #{}costruttore, come affermato dalle altre risposte. Voglio anche sottolineare che c'è una vera sottigliezza qui a cui prestare attenzione qui:

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

Sebbene le stringhe possano essere create con virgolette singole (come dimostrato dalle variabili first_namee last_name, il #{}costruttore può essere utilizzato solo nelle stringhe con virgolette doppie.


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

è un altro modo per farlo.


10

Questa si chiama interpolazione di stringhe e lo fai in questo modo:

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

Importante: funzionerà solo quando la stringa è racchiusa tra virgolette doppie ("").

Esempio di codice che non funzionerà come previsto:

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

Grazie per aver utilizzato il termine corretto in modo che i nuovi programmatori possano imparare: interpolazione.
Mike Bethany

3

Il sistema di template ERB standard potrebbe funzionare per il tuo scenario.

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

Puoi usarlo con le tue variabili locali, in questo modo:

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

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

l'uscita sarebbe: "Il cane lecca l' uccello "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.