В Python это можно сделать:
print "Hi! I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})
Какая самая простая и близкая идиома Ruby воспроизводит это поведение? (Пожалуйста, не пытайтесь патчить класс String.)
Обновлено: Одним из действительно отличных преимуществ этого является то, что вы можете сохранить предварительно обработанную строку в переменной и использовать ее как «шаблон», например:
template = "Hi! I'm %(name)s, and I'm %(age)d years old."
def greet(template,name,age):
print template % ({"name":name,"age":age})
Это, очевидно, тривиальный пример, но возможность сохранить такую строку для дальнейшего использования очень полезна. Соглашение Ruby "Hi! I'm #{name}" очень похоже, но немедленная оценка делает его менее универсальным.
Пожалуйста, не понижайте голоса за ответы, предлагающие метод #{var}, поскольку они были получены до этого редактирования. (Ядро случайной идеи: возможно, ответы должны быть защищены от голосов, если автор вопроса помечает их как "устаревшие" ...?)






В строку с двойными кавычками в Ruby вы можете вставить результат выражения Ruby следующим образом:
puts "Hi! I'm #{name}, and I'm #{age} years old."
Просто вставьте выражение в фигурные скобки. (Это также может быть что-то более сложное, например # {age + 5} или # {name + '' + last_name}, или вызов функции.)
помещает "Привет! Я # {name}, мне # {age} лет".
В Ruby есть несколько хороших трюков:
name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
class Template
def %(h)
"Hi! I'm #{h[:name]}s, and I'm #{h[:age]}d years old."
end
end
Затем позвоните с помощью
t=Template.new
t%({:name => "Peter", :age => 18})
Это не совсем то, о чем вы просили, но это может дать вам подсказку.
Однако (пока что) работает что-то вроде:
d = {"key1" => "value1", "key2" => "value2"}
s = "string to be magically induced with variables, which are \n * %s and \n * %s.\n"
print s%d.values()
# or
print s%[d["key1"], d["key2"]]
Вы также можете использовать
printf "1: %<key1>s 2: %<key2>s\n", {:key1 => "value1", :key2 => "value2"}
или же
data = {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
или (для этого нужен Ruby 1.9, для других примеров я не уверен)
data = {key1: "value1", key2: "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
Это печатает
1: value1 2: value2
Важное ограничение: используемые ключи хэша (данные в моем примере) должны быть символами.
Замечание к приведенному выше примеру:
printf принимает одну строку формата и необязательные параметры. Но есть еще String#%-метод.
Следующие четыре вызова имеют одинаковый результат:
printf "1: %<key1>s 2: %<key2>s\n" , {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"}
print "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"}
puts "1: %<key1>s 2: %<key2>s" % {:key1 => "value1", :key2 => "value2"}
Вторая версия сначала использует метод String#% и отправляет результат на printf.
вы делаете это так:
values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values
Прочтите это для получения дополнительной информации: http://ruby.runpaint.org/strings#sprintf-hash
Если вам нужно что-то более сложное, прочтите об ERB и механизмах шаблонов Google. Если вам нужно создавать веб-страницы, электронные письма и т. д., Вы обнаружите, что использование шаблонизаторов является более надежным решением.
вам, вероятно, следует добавить это к своему ответу @Michael.
На самом деле это работает, если вы измените ключи в хэше
valuesна символы вместо строк:values = {:hello => 'world', :world => 'hello'}. См. Последнее предложение в ответ @ knut.