Как улучшить код, который цитирует все элементы массива с помощью `'` и возвращает строку, содержащую все эти элементы в кавычках и через запятую?

Я использую Rails 3.2.2, и я хотел бы процитировать все элементы массива с' и вернуть строку, содержащую все эти элементы в кавычках и через запятую. В настоящее время я использую

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

но я думаю, что могу улучшить приведенный выше код (возможно, используя неизвестный мне метод Ruby, если он существует). Является ли это возможным?

 Holger Just18 мая 2012 г., 08:29
Что произойдет, если одна из строк в массиве содержит' сам по себе, например["a", "b'cd"]?
 Backo18 мая 2012 г., 09:20
@ Холгер Просто - Опс!
 Andrew Marshall18 мая 2012 г., 08:01
То, что у тебя есть, кажется мне хорошим.
 Dty18 мая 2012 г., 08:41
То, что у тебя есть, хорошо. Кроме того, это чистый рубин. Нет ничего "рельсов" об этом.
 jdoe18 мая 2012 г., 08:23
Нет ничего для оптимизации, но вы можете использовать псевдонимы:map вместоcollect а также* вместоjoin если вам не хватает кода, чтобы уменьшить размер кода:%w[a b c].map{|x|"'#{x}'"}*', '.

Ответы на вопрос(2)

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

Вот расширенная версия:

' # Starting quote
%w{a b c}.join("', '") # Join array with ', ' delimiter that would give a', 'b', 'c
' # Closing quote
 26 дек. 2012 г., 09:47
 26 дек. 2012 г., 18:47
Вы можете включить это в свой ответ, чтобы объяснить, почему ваш код предпочтительнее. Кроме того, вы имеете в виду сборку мусора с помощью "GC"?
 26 дек. 2012 г., 11:15
И вот почему: прежде всего, он обходит массив один раз, а не два (сопоставление и объединение). Во-вторых, он создает меньше объектов ruby - одну строку-обертку для фактического результата и одну строку в качестве результата соединения. Исходное решение создает новый массив для результата карты и новую строку для каждого элемента в массиве. Это может показать ухудшение производительности на большем массиве, так как GC займет больше времени.

collect с его псевдонимомmap а также.join с эквивалентным*, Наконец, вы можете использоватьярлык для записи массива строк, %w(...)и вы можете использовать одинарные кавычки для аргумента.join/* поскольку он не использует интерполяцию строк (хотя это может быть сомнительным, если это предпочтительнокогда дело доходит до производительности).

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

Похоже, что нет разницы в производительности между этой версией и оригиналом, но что этоВерсия Сигурда работает лучше:

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)

Код для бенчмарка:

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

Ваш ответ на вопрос