Что такое Ruby-эквивалент Python `s =« hello,% s. Где% s? " % («Джон», «Мэри») `

141

В Python эта идиома для форматирования строк довольно распространена

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

Что эквивалентно в Ruby?

TIMEX
источник
3
Нет конкатенации строк, только форматирование строк. И Google ответит на это быстрее, чем когда-либо смог бы даже ТАК ... мне потребовалось около 20 секунд, чтобы узнать, что вы можете сделать то же самое в Ruby.
Вы просите не конкатенацию, а форматирование / замену. Вам следует изменить свой вопрос. Кстати, в ruby ​​конкатенация выполняется операторами + или <<.
Дэвид

Ответы:

246

Самый простой способ - интерполяция строк . Вы можете вставлять небольшие фрагменты кода Ruby прямо в свои строки.

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

Вы также можете форматировать строки в Ruby.

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

Не забудьте использовать здесь квадратные скобки. В Ruby нет кортежей, только массивы, и в них используются квадратные скобки.

О Ruby
источник
1
Я бы определенно использовал первый, он мне кажется более читаемым
Дэвид
1
Первый не будет работать, # {} ищет переменную, поэтому в этом случае он будет печатать переменную John, а не строку «John». Второй выглядит правильно.
Джейсон Ноубл,
11
Вы также должны быть осторожны и всегда использовать двойные кавычки, так как '#{name1}'это не то же самое, что "#{name1}".
Droogans 06
3
Интерполяция строк в одинарных кавычках не работает, вы должны использовать двойные кавычки. Например:, '#{"abc"}' # => "\#{\"abc\"}"но вы хотите"#{"abc"}" # => "abc"
bschlueter
2
Первый способ не является эквивалентом - шаблон нельзя передавать как значение.
Ондра Жижка
51

В Ruby> 1.9 вы можете сделать это:

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

См. Документацию

тонг
источник
Я отредактировал там эквивалент Idomatic Ruby - но теперь я замечаю, что принятый ответ уже делает это - снова удалил «редактировать»: - /
toong
При использовании хэша с оператором строки%, если ключевой символ, указанный в строке формата, отсутствует, вы получите KeyError.
user1164178
19

Практически так же:

irb(main):003:0> "hello, %s. Where is %s?" % ["John","Mary"]
=> "hello, John. Where is Mary?"
Манодж Говиндан
источник
Означают ли квадратные скобки кортеж в Ruby? Я думал, квадратные скобки - это списки ...
TIMEX
@TIMEX: Этот вопрос поможет: stackoverflow.com/questions/525957/tuples-in-ruby
Манодж Говиндан,
3
Ruby не имеет кортежей (по крайней мере, не встроенных в язык). Да, это массив («список» в Python действительно следует называть массивами ...).
9

Собственно почти то же самое

s = "hello, %s. Where is %s?" % ["John","Mary"]
Phadej
источник