%{}和%s之间有什么区别?

时间:2014-08-26 17:25:19

标签: ruby

在Learn Ruby the Hard Way书中的练习9中,我被要求写下以下内容:

formatter = "%{first} %{second} %{third} %{fourth}"
puts formatter % {first: 1, second: 2, third: 3, fourth: 4}

只是评估为

1 2 3 4

在搜索时,我注意到很多人都写了这个:

formatter = "%s %s %s %s"
puts formatter % [1, 2, 3, 4]

我相信后一个例子来自本书的旧版本。有人可以向我解释这两个例子之间的区别是什么吗?

2 个答案:

答案 0 :(得分:4)

对此的快速回答是%{}语法允许您传入要替换为字符串的命名参数,而%s语法只能按照给定的顺序替换项目。

您可以使用%{}版本执行更多操作,例如,如果您需要多次替换相同的字符串,则可以像这样写出来:

 string = "Hello %{name}, nice to meet you %{name}. Now I have said %{name} three times, I remember your name."
 string % { :name => "Magnus" }

使用%s语法,您必须写:

string = "Hello %s, nice to meet you %s. Now I have said %s three times, I remember your name."
string % ["Magnus", "Magnus", "Magnus"]

还有许多其他格式和方法可以在Ruby中为字符串编写替换。可以找到完整的解释here in the Ruby documentation

答案 1 :(得分:0)

formatter = "%{first} %{second} %{third} %{fourth}"

formatter = "%s %s %s %s"

基本相同,格式化方法将取值并将它们替换为字符串,但第一个格式字符串在第二个格式字符串中使用命名占位符与未命名占位符。

这会影响您传递被替换值的方式。第一个接受符号散列,并使用该散列的键来标识哪个字段获得该关联值。在第二个中,您传递一个数组,并在替换为格式字符串时从数组中按位置拾取值。

第二种更常见,并且已存在多年,因此您会更频繁地看到它。第一个,因为它的新版本不会在旧的Rubies上运行,但是具有导致更易读的格式字符串的优点,这有利于维护。另外,正如@griffin在他的评论中所说,第一个也允许你在必要时更容易重复一个值。您可以在将数组传递给旧式格式时执行此操作,但是哈希在内存方面会更有效,特别是对于您已经有很多变量重复使用的情况。

注意:您会看到%{foo}f%<foo>f。传入的变量的格式有所不同,因此请小心使用:

'%<foo>f' % {:foo => 1} # => "1.000000"
'%{foo}f' % {:foo => 1} # => "1f"

我认为差异太微妙,会给不知情的开发人员带来麻烦。有关更多信息,请参阅Kernel#sprintf文档。