9

在 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}技术的答案投反对票,因为它们来自此编辑之前。(随机想法内核:如果问题作者将答案标记为“过时”,也许应该保护答案不被投票......?)

4

7 回答 7

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.

于 2012-09-24T10:19:55.190 回答
15

你这样做:

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

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

如果您需要更复杂的东西,请阅读 ERB 和 google 模板引擎。如果您需要生成网页、电子邮件等,您会发现使用模板引擎是一种更强大的解决方案。

于 2012-10-23T09:53:41.590 回答
6

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

name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
于 2008-10-13T06:34:09.293 回答
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})

这不完全是您所要求的,但可以给您一个提示。

于 2008-10-13T19:47:39.537 回答
2

在 Ruby 中的双引号字符串中,您可以插入 Ruby 表达式的结果,如下所示:

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

只需在花括号内放置一个表达式即可。(也可以是更复杂的东西,比如#{age + 5},或#{name + ' ' + last_name},或函数调用。)

于 2008-10-13T06:31:22.217 回答
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"]]
于 2012-09-24T09:55:50.270 回答
0

放“嗨!我是 #{name},我 #{age} 岁。”

于 2008-10-13T06:31:53.807 回答