在Python中,你可以这样做:
print "Hi! I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})
复制此行为的最接近,最简单的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})
这显然是一个简单的例子,但是能够存储这样的字符串供以后使用有很多实用性。 Ruby的"Hi! I'm #{name}"
约定非常相似,但是立即评估会使其不那么通用。
请不要在建议使用#{var}
技巧的答案,因为它们来自此编辑之前。 (随意的内核:如果一个问题作者将它们标记为“过时”,也许应该保护答案免受投票......?)
答案 0 :(得分: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
。
答案 1 :(得分:15)
values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values
阅读本文以获取更多信息: http://ruby.runpaint.org/strings#sprintf-hash
如果您需要更复杂的内容,请阅读有关ERB和Google模板引擎的信息。 如果您需要生成网页,电子邮件等,您会发现使用模板引擎是一种更强大的解决方案。
答案 2 :(得分:6)
在Ruby中有一些很好的技巧:
name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
答案 3 :(得分:3)
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})
这不是你要求的,但可以给你一个提示。
答案 4 :(得分:2)
在Ruby中的双引号字符串中,您可以插入Ruby表达式的结果,如下所示:
puts "Hi! I'm #{name}, and I'm #{age} years old."
只需在花括号内放一个表达式。 (它也可能是更复杂的东西,如#{age + 5},或#{name +''+ last_name},或函数调用。)
答案 5 :(得分:2)
然而,(同时)有效的是:
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"]]
答案 6 :(得分:0)
说“嗨!我是#{name},而我已经#{age}岁了。”