Как мне эмулировать именованные параметры Python для Python в Ruby? - PullRequest
9 голосов
/ 13 октября 2008

В 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}, как они пришли до этого редактирования. (Ядро случайной идеи: возможно, ответы должны быть защищены от голосов, если автор вопроса помечает их как «устаревшие» ...?)

Ответы [ 7 ]

16 голосов
/ 24 сентября 2012

Вы также можете использовать

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

Важное ограничение: используемые ключи хэша ( data в моем примере) должны быть символами.


Замечание на примере выше: 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.

15 голосов
/ 23 октября 2012

вы делаете это так:

values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values

Прочитайте это для получения дополнительной информации: http://ruby.runpaint.org/strings#sprintf-hash

Если вам нужно что-то более изощренное, читайте о ERB и движках шаблонов Google. Если вам нужно создать веб-страницы, электронную почту и т. Д., Вы обнаружите, что использование шаблонизаторов - более надежное решение.

6 голосов
/ 13 октября 2008

В Ruby есть хороший трюк:

name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
3 голосов
/ 13 октября 2008
 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})

Это не совсем то, о чем вы просили, но может дать вам подсказку.

2 голосов
/ 24 сентября 2012

Что работает (между тем), тем не менее, что-то вроде:

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"]]
2 голосов
/ 13 октября 2008

В строке с двойными кавычками в Ruby вы можете вставить результат выражения Ruby следующим образом:

puts "Hi!  I'm #{name}, and I'm #{age} years old."

Просто поместите выражение в фигурные скобки. (Это также может быть что-то более сложное, например # {age + 5} или # {name + '' + last_name}, или вызов функции.)

0 голосов
/ 13 октября 2008

ставит «Привет! Мне # {имя}, и мне # {возраст} лет».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...