Ruby: объединение переменных в строку
Я ищу лучший способ объединить переменные в строку в Ruby.
Например, если строка имеет значение:
"animal
action
second_animal
"
И у меня есть переменные для animal
, action
и second_animal
, какой предпочтительный способ включить эти переменные в строку?
Ответы
Ответ 1
Идиоматический способ - написать что-то вроде этого:
"The #{animal} #{action} the #{second_animal}"
Обратите внимание на двойные кавычки ("), окружающие строку: это триггер для Ruby, чтобы использовать его встроенную замену заполнителя. Вы не можете заменить их одиночными кавычками ('), или строка будет сохранена как есть.
Ответ 2
Вы можете использовать форматирование sprintf, чтобы вставлять значения в строку. Для этого строка должна содержать заполнители. Поместите свои аргументы в массив и используйте следующие способы:
(Для получения дополнительной информации смотрите документацию для 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
Вы даже можете явно указать номер аргумента и перетасовать их вокруг:
'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']
Или укажите аргумент с помощью хеш-ключей:
'The %{animal} %{action} the %{second_animal}' %
{ :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}
Обратите внимание, что вы должны указать значение для всех аргументов для оператора %
. Например, вы не можете избежать определения animal
.
Ответ 3
Я бы использовал конструктор #{}
, как указано в других ответах.
Я также хочу отметить, что здесь есть настоящая тонкость:
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
В то время как строки могут быть созданы с одинарными кавычками (как показано переменными first_name
и last_name
, конструктор #{}
может использоваться только в строках с двойными кавычками.
Ответ 4
["The", animal, action, "the", second_animal].join(" ")
- это еще один способ сделать это.
Ответ 5
Это называется интерполяцией строк, и вы делаете это следующим образом:
"The #{animal} #{action} the #{second_animal}"
Важно: он будет работать, только если строка находится внутри двойных кавычек ("").
Пример кода, который не будет работать так, как вы ожидаете:
'The #{animal} #{action} the #{second_animal}'
Ответ 6
Стандартная система шаблонов ERB может работать для вашего сценария.
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"
Ответ 7
Вы можете использовать его с вашими локальными переменными, например:
@animal = "Dog"
@action = "licks"
@second_animal = "Bird"
"The #{@animal} #{@action} the #{@second_animal}"
вывод будет следующим: " Собака лижет Птица"