Как мне эмулировать именованные параметры printf Python в Ruby?

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
9
0
3 886
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

В строку с двойными кавычками в 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. Если вам нужно создавать веб-страницы, электронные письма и т. д., Вы обнаружите, что использование шаблонизаторов является более надежным решением.

На самом деле это работает, если вы измените ключи в хэше values на символы вместо строк: values = {:hello => 'world', :world => 'hello'}. См. Последнее предложение в ответ @ knut.

Vicky Chijwani 14.01.2013 06:53

вам, вероятно, следует добавить это к своему ответу @Michael.

Vicky Chijwani 05.02.2013 17:21

Другие вопросы по теме