关于ruby on rails:如何改进用“`引用所有数组元素的代码并返回包含所有引用和逗号分隔元素的字符串?

How to improve code that quotes all array elements with `'` and returns a string containing all those quoted and comma-separated elements?

我使用的是Rails 3.2.2,我想用'引用所有数组元素,并返回一个包含所有这些带引号和逗号分隔的元素的字符串。此时我正在使用

1
2
['a', 'b', 'c'].collect {|x|"'#{x}'"}.join(",")
# =>"'a', 'b', 'c'"

但我认为我可以改进上面的代码(如果存在的话,也许可以使用一个我不知道的Ruby方法)。有可能吗?


我用

1
"'#{%w{a b c}.join("', '")}'"

以下是扩展版本:

1
2
3
' # Starting quote
%w{a b c}.join("'
, '") # Join array with ', ' delimiter that would give a', 'b', 'c
'
# Closing quote


您可以将collect替换为其别名map,将.join替换为等效的*。最后,您可以使用快捷方式编写字符串数组,即%w(...),也可以使用单引号作为.join/*的参数,因为它不使用字符串插值(但在性能方面,如果更可取的话,可能会有疑问)。

1
%w(a b c).map {|x|"'#{x}'"} * ', '

看起来这个版本和原始版本没有性能差异,但是sigurd的版本性能更好:

1
2
3
Original  3.620000   0.000000   3.620000 (  3.632081)
This  3.640000   0.000000   3.640000 (  3.651763)
Sigurd's  2.300000   0.000000   2.300000 (  2.303195)

基准代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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