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

Ruby %{}和%s之间有什么区别?,ruby,Ruby,在学习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] 我

在学习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]
我相信后一个例子来自这本书的旧版本。有人能给我解释一下这两个例子之间的区别吗

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

本质上是相同的,格式化方法将获取值并将其替换为字符串,但是第一个格式字符串使用命名占位符,而第二个格式字符串使用未命名占位符

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

第二种更常见,已经存在多年,所以你会经常看到它。第一个,因为它是较新的,不会在旧的Rubies上运行,但是它的优点是可以产生更可读的格式字符串,这有利于维护。此外,正如@griffin在他的评论中所说的,如果需要,第一种方法还可以让你更容易地重复一个值。可以在将数组传递到旧式格式时执行此操作,但哈希在内存方面会更有效,特别是在有大量重复使用的变量的情况下

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

'%<foo>f' % {:foo => 1} # => "1.000000"
'%{foo}f' % {:foo => 1} # => "1f"
我认为这种差异太微妙了,会给不知情的开发人员带来问题。有关更多信息,请参阅文档

本质上是相同的,格式化方法将获取值并将其替换为字符串,但是第一个格式字符串使用命名占位符,而第二个格式字符串使用未命名占位符

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

第二种更常见,已经存在多年,所以你会经常看到它。第一个,因为它是较新的,不会在旧的Rubies上运行,但是它的优点是可以产生更可读的格式字符串,这有利于维护。此外,正如@griffin在他的评论中所说的,如果需要,第一种方法还可以让你更容易地重复一个值。可以在将数组传递到旧式格式时执行此操作,但哈希在内存方面会更有效,特别是在有大量重复使用的变量的情况下

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

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

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

快速回答是%{}语法允许您将要替换的命名参数传入字符串,而%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中,还有许多其他格式和方法可以编写字符串替换。可以找到完整的解释。

快速回答是,%{}语法允许您将要替换的命名参数传递到字符串中,而%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中,还有许多其他格式和方法可以编写字符串替换。可以找到完整的解释。

前者允许命名并重用注入字符串中的变量。后者不允许这样做,前者允许命名并重用注入字符串的变量。后者不允许这样做。当我必须多次传递一个值时,我使用数组乘法:%w[Magnus]*3=>[Magnus,Magnus,Magnus]或['foo',*%w[bar]*3,'foo']=>[foo,bar,bar,bar,foo]@theTinMan似乎把事情复杂化了。我想我更希望能够清楚地看到被替换的是什么,而不是计算出一个数组将是什么,以便知道需要替换多少项。它可以避免任何重复,比如第二个例子中的“foo”。当我必须多次传递一个值时,我使用数组乘法:%w[Ma
gnus]*3=>[Magnus,Magnus,Magnus]或['foo',*%w[bar]*3'foo']=>[foo,bar,bar,bar,foo]@看起来事情太复杂了。我想我更希望能够清楚地看到被替换的是什么,而不是计算出一个数组将是什么,以便知道需要替换多少项。它可以避免任何重复,比如第二个例子中的“foo”。