如何在Ruby中模拟Python的命名printf参数?

Max*_*tor 9 ruby python string printf

在Python中,您可以这样做:

print "Hi!  I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})
Run Code Online (Sandbox Code Playgroud)

什么是最接近,最简单的Ruby习惯用于复制这种行为?(请不要monkeypatching 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})
Run Code Online (Sandbox Code Playgroud)

这显然是一个简单的例子,但是能够存储这样的字符串供以后使用有很多实用性.Ruby的"Hi! I'm #{name}"惯例很相似,但是即时评估使它的功能更少.

请不要#{var}在这个编辑之前提供有关技术的答案.(随意的内核:如果一个问题作者将它们标记为"过时",也许应该保护答案免受投票......?)

knu*_*nut 16

你也可以使用

printf "1: %<key1>s 2: %<key2>s\n", {:key1 => "value1", :key2 => "value2"}
Run Code Online (Sandbox Code Playgroud)

要么

data = {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n",  data
Run Code Online (Sandbox Code Playgroud)

或者(这需要ruby 1.9,对于其他例子,我不确定)

data = {key1: "value1", key2: "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data
Run Code Online (Sandbox Code Playgroud)

这打印

1: value1 2: value2
Run Code Online (Sandbox Code Playgroud)

重要限制:哈希的已使用键(我的示例中的数据)必须是符号.


关于上面示例的注释: 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"}
Run Code Online (Sandbox Code Playgroud)

第二个版本首先使用String#%-method并将结果发送到printf.


Mic*_*los 15

你这样做:

values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values
Run Code Online (Sandbox Code Playgroud)

阅读本文以获取更多信息:http: //ruby.runpaint.org/strings#sprintf-hash

如果您需要更复杂的内容,请阅读有关ERB和Google模板引擎的信息.如果您需要生成网页,电子邮件等,您会发现使用模板引擎是一种更强大的解决方案.


Hon*_*nza 6

在Ruby中有一些很好的技巧:

name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
Run Code Online (Sandbox Code Playgroud)