首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >%{}和%s之间有什么区别?

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

Stack Overflow用户
提问于 2014-08-26 17:25:18
回答 2查看 231关注 0票数 1

在“学习Ruby艰难之路”一书中的练习9中,我被要求写以下内容:

代码语言:javascript
复制
formatter = "%{first} %{second} %{third} %{fourth}"
puts formatter % {first: 1, second: 2, third: 3, fourth: 4}

它的评估结果是

代码语言:javascript
复制
1 2 3 4

在四处搜寻的时候,我注意到很多人都写了这篇文章:

代码语言:javascript
复制
formatter = "%s %s %s %s"
puts formatter % [1, 2, 3, 4]

我相信后一个例子来自于这本书的旧版本。有人能向我解释一下这两个例子的区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-26 17:36:06

对此的快速回答是,%{}语法允许将命名的参数传递到字符串中,而%s语法只按给定的顺序替换条目。

您可以使用%{}版本做更多的事情,例如,如果您需要多次替换相同的字符串,您可以这样写出它:

代码语言:javascript
复制
 string = "Hello %{name}, nice to meet you %{name}. Now I have said %{name} three times, I remember your name."
 string % { :name => "Magnus" }

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

代码语言:javascript
复制
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文档中

票数 4
EN

Stack Overflow用户

发布于 2014-08-26 17:30:32

代码语言:javascript
复制
formatter = "%{first} %{second} %{third} %{fourth}"

代码语言:javascript
复制
formatter = "%s %s %s %s"

本质上是相同的,因为格式化方法将接受值并将它们替换为字符串,但是第一个格式字符串使用命名占位符,而第二个格式字符串使用未命名占位符。

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

第二种更常见,已经存在多年了,所以你会更经常地看到它。首先,因为它较新,所以不会在旧的Rubies上运行,但是它的优点是会产生更易读的格式字符串,这对维护很有好处。此外,正如@griffin在他的评论中说的那样,第一个也允许您在必要时更容易地重复一个值。当将数组传递到旧的格式时,您可以这样做,但是散列在内存方面会更有效,特别是在有大量正在重用的变量的情况下。

注意:您将看到%{foo}f%<foo>f。在传入的变量的格式化方式上存在差异,因此请注意您使用的是:

代码语言:javascript
复制
'%<foo>f' % {:foo => 1} # => "1.000000"
'%{foo}f' % {:foo => 1} # => "1f"

我认为这种差别太微妙了,会给不知情的开发人员带来问题。有关更多信息,请参见Kernel#sprintf文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25511709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档