9

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

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

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

4

2 回答 2

11

我用

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

这是扩展版本:

' # Starting quote
%w{a b c}.join("', '") # Join array with ', ' delimiter that would give a', 'b', 'c
' # Closing quote
于 2012-12-25T16:49:46.737 回答
7

您可以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
于 2012-12-25T16:34:55.820 回答