Що таке Ruby еквівалент `s =“ привіт, Python's Python. Де% s? " % ("Іван", "Марія") "


141

У Python ця ідіома для форматування рядків є досить поширеною

s = "hello, %s. Where is %s?" % ("John","Mary")

Який еквівалент у Ruby?


3
Немає з'єднання рядків, лише форматування рядків. І Google відповість на це швидше, ніж навіть ТАК колись міг ... мені знадобилося приблизно 20 секунд, щоб дізнатися, що ти можеш зробити те саме в Ruby.

Ви не просите конкатенації, ви просите форматування / заміни. Вам слід змінити питання. До речі, в рубіні конкатенація виконується з + або << операторами.
Девід

Відповіді:


246

Найпростіший спосіб - струнна інтерполяція . Ви можете вводити невеликі шматочки коду Ruby безпосередньо у свої струни.

name1 = "John"
name2 = "Mary"
"hello, #{name1}.  Where is #{name2}?"

Ви також можете робити рядки формату в Ruby.

"hello, %s.  Where is %s?" % ["John", "Mary"]

Не забудьте використовувати там квадратні дужки. У Ruby немає кортежів, а лише масиви, а ті, що використовують квадратні дужки.


1
Я б остаточно скористався першим, він мені здається більш читальним
Девід

1
Перший не працюватиме, # {} шукає змінну, тому в цьому випадку це буде друк змінної John, а не рядок "John". Другий виглядає правильно.
Джейсон Благородний

11
Ви також повинні бути обережними завжди використовувати подвійні лапки, оскільки '#{name1}'це не те саме, що "#{name1}".
Droogans

3
Інтерполяція рядків не працює в одиничних лапках, ви повинні використовувати подвійні лапки. Наприклад:, '#{"abc"}' # => "\#{\"abc\"}"але те, що ви хочете,"#{"abc"}" # => "abc"
bschlueter

2
Перший спосіб не є еквівалентом - шаблон не можна передавати як значення.
Ондра Жижка

51

У Ruby> 1.9 ви можете це зробити:

s =  'hello, %{name1}. Where is %{name2}?' % { name1: 'John', name2: 'Mary' }

Дивіться документи


Я редагував в Idomatic Рубіновий еквівалент там - але тепер я помічаю загальноприйнятий відповідь вже робить що - зняв «змінити» знову: - /
Toong

Якщо ви використовуєте хеш з оператором string%, якщо символ ключа, на який посилається у рядку формату, немає, ви отримаєте KeyError.
користувач1164178

19

Майже так само:

irb(main):003:0> "hello, %s. Where is %s?" % ["John","Mary"]
=> "hello, John. Where is Mary?"

Чи означають квадратні дужки в Рубі кортеж? Я думав, що квадратні дужки є списками ...
TIMEX


3
У Рубі немає кортежів (принаймні не підроблених на мові). Так, це масив ("список" в Python дійсно слід називати масивами ...).

9

Насправді майже те саме

s = "hello, %s. Where is %s?" % ["John","Mary"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.