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