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

后端 未结 2 911
醉梦人生
醉梦人生 2021-02-14 18:42

I am using Rails 3.2.2 and I would like to quote all array elements with \' and return a string containing all those quoted and comma-separated elements. At this ti

相关标签:
2条回答
  • 2021-02-14 18:51

    You can replace collect with its alias map and .join with the equivalent *. Finally, you can use the shortcut for writing an array of strings, %w(...), and you can use single quotes for the argument of .join/* as it does not use string interpolation (though it may be questionable if it preferable when it comes to performance).

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

    It appears there is no performance difference between this version and the original but that that Sigurd's version is performing better:

    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)

    Code for benchmark:

    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
    
    0 讨论(0)
  • 2021-02-14 18:56

    I use

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

    Here is expanded version:

    ' # Starting quote
    %w{a b c}.join("', '") # Join array with ', ' delimiter that would give a', 'b', 'c
    ' # Closing quote
    
    0 讨论(0)
提交回复
热议问题