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

9 投票
7 回答
4007 浏览
提问于 2025-04-11 09:24

在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}"写法有点类似,但因为它是立即计算的,所以灵活性就差一些。

7 个回答

6

在Ruby中,有一些很不错的小技巧:

name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
15

你可以这样做:

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

想了解更多信息,可以看看这个链接: http://ruby.runpaint.org/strings#sprintf-hash

如果你需要更复杂的功能,可以了解一下ERB,或者去搜索模板引擎。 如果你需要生成网页、邮件等内容,使用模板引擎会是一个更可靠的解决方案。

16

你还可以使用

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

撰写回答