在“学习Ruby艰难之路”一书中的练习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]我相信后一个例子来自于这本书的旧版本。有人能向我解释一下这两个例子的区别吗?
发布于 2014-08-26 17:36:06
对此的快速回答是,%{}语法允许将命名的参数传递到字符串中,而%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中还有许多其他格式和编写字符串替换的方法。完整的解释可以找到在Ruby文档中。
发布于 2014-08-26 17:30:32
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文档。
https://stackoverflow.com/questions/25511709
复制相似问题