Ruby: Об’єднання змінних у рядок


95

Я шукаю кращий спосіб об'єднати змінні в рядок у Ruby.

Наприклад, якщо рядок є приблизно таким:

« »animal actionsecond_animal

І у мене є змінні для animal, actionі second_animal, який найкращий спосіб додати ці змінні до рядка?

Відповіді:


240

Ідіоматичний спосіб - написати щось подібне:

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

Зверніть увагу на подвійні лапки ("), що оточують рядок: це тригер для Ruby використовувати вбудовану заміну заповнювача. Ви не можете замінити їх одинарними лапками ('), або рядок буде збережено як є.


2
Вибачте, можливо, я занадто спростив проблему. Рядок буде витягнуто з бази даних, а змінна залежить від ряду факторів. Зазвичай я б використовував заміну для 1 або двох змінних, але це може бути більше. Будь-які думки?
FearMediocrity

Конструкція # {}, мабуть, найшвидша (хоча мені це все ще здається неінтуїтивною). Окрім пропозиції gix, ви також можете збирати рядки з + або <<, але можуть бути створені деякі проміжні рядки, що є дорогим.
Майк Вудхаус,

Найкращий спосіб інтерполяції змінних
Драгутеску Александру

115

Ви можете використовувати спринтоване форматування, щоб вводити значення в рядок. Для цього рядок повинен містити заповнювачі. Помістіть свої аргументи в масив і використовуйте один із таких способів: (Для отримання додаткової інформації дивіться документацію до 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.


18

Я б використовував #{}конструктор, як зазначено в інших відповідях. Я також хочу зазначити, що тут є справжня тонкість, на яку слід звертати увагу:

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змінні, конструктор може бути використаний тільки в рядках з подвійними лапками.#{}



10

Це називається інтерполяцією рядків, і ви робите це так:

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

Важливо: це буде працювати лише тоді, коли рядок знаходиться всередині подвійних лапок ("").

Приклад коду, який працюватиме не так, як ви очікуєте:

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

Дякуємо за використання належного терміна, щоб нові програмісти могли навчитися: інтерполяція.
Mike Bethany

3

Стандартна система шаблонування 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"

0

Ви можете використовувати його з локальними змінними, наприклад:

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

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

вихід буде: «The Dog лиже Птах »

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.