我正在使用 Rails 3.2.2,我想引用所有数组元素'
并返回一个包含所有引用和逗号分隔元素的字符串。这个时候我正在使用
['a', 'b', 'c'].collect {|x| "'#{x}'"}.join(", ")
# => "'a', 'b', 'c'"
但我认为我可以改进上面的代码(也许通过使用我不知道的 Ruby 方法,如果它存在的话)。可能吗?
我正在使用 Rails 3.2.2,我想引用所有数组元素'
并返回一个包含所有引用和逗号分隔元素的字符串。这个时候我正在使用
['a', 'b', 'c'].collect {|x| "'#{x}'"}.join(", ")
# => "'a', 'b', 'c'"
但我认为我可以改进上面的代码(也许通过使用我不知道的 Ruby 方法,如果它存在的话)。可能吗?
我用
"'#{%w{a b c}.join("', '")}'"
这是扩展版本:
' # Starting quote
%w{a b c}.join("', '") # Join array with ', ' delimiter that would give a', 'b', 'c
' # Closing quote
您可以collect
用它的别名map
和.join
等效的*
. 最后,您可以使用编写字符串数组的快捷方式, %w(...)
,并且您可以将单引号用于.join
/的参数,*
因为它不使用字符串插值(尽管在性能方面是否更可取可能值得怀疑)。
%w(a b c).map {|x| "'#{x}'"} * ', '
看起来这个版本和原始版本之间没有性能差异,但Sigurd 的版本表现更好:
原始 3.620000 0.000000 3.620000 ( 3.632081) 这 3.640000 0.000000 3.640000 ( 3.651763) 西格德的 2.300000 0.000000 2.300000 ( 2.303195)
基准代码:
require 'benchmark'
n = 1000000
Benchmark.bm do |x|
x.report("Original") { n.times do
['a', 'b', 'c'].collect {|x| "'#{x}'"}.join(", ")
end}
x.report("This") { n.times do
%w(a b c).map {|x| "'#{x}'"} * ', '
end}
x.report("Sigurd's") { n.times do
"'#{%w{a b c}.join("', '")}'"
end}
end