2012-05-18 20 views
9

Estoy usando Rails 3.2.2 y me gustaría citar todos los elementos de la matriz con ' y devolver una cadena que contenga todos los elementos entre comillas y separados por comas. En este momento estoy usando¿Cómo mejorar el código que cita todos los elementos de la matriz con `'` y devuelve una cadena que contiene todos los elementos entre comillas y separados por comas?

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

pero creo que puedo mejorar el código anterior (tal vez mediante el uso de un método desconocido para mí Ruby, si es que existe). ¿Es posible?

+3

Lo que tiene parece bueno para mí. –

+0

No hay nada que optimizar, pero puedes usar alias: 'map' en lugar de' collect' y '*' en lugar de 'join' si estás muriendo de hambre para hacer que tu código sea más pequeño:'% w [abc] .map {| x | "'# {x}'"} * ',' '. – jdoe

+2

¿Qué sucede si una de las cadenas en la matriz contiene un '' 'por sí mismo, p. '[" a "," b'cd "]'? –

Respuesta

6

Puede reemplazar collect con su alias map y .join con el equivalente *. Finalmente, puede usar the shortcut for writing an array of strings, %w(...), y puede usar comillas simples para el argumento de .join/* ya que no utiliza la interpolación de cadenas (aunque puede ser cuestionable si es preferible when it comes to performance).

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

Parece que no hay diferencia de rendimiento entre esta versión y la original, pero que esa Sigurd's version está realizando mejor:

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)

Código de referencia:

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 
11

utilizo

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

Aquí está la versión expandida:

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

Parece que [su versión funciona mejor] (http://stackoverflow.com/a/14032344/789593). –

+0

He aquí por qué: En primer lugar, camina array una vez en lugar de dos (mapa y unirse). En segundo lugar, crea menos objetos de rubí: una cadena de envoltura para el resultado real y una cadena como resultado de la combinación. La solución inicial crea una nueva matriz para el resultado del mapa y una nueva cadena para cada elemento en la matriz. Podría mostrar un empeoramiento del rendimiento en una matriz más grande, ya que GC tardaría más. – Sigurd

+0

Es posible que desee incluir eso en su respuesta para explicar por qué es preferible su código. Además, ¿te refieres a la recolección de basura con 'GC'? –

Cuestiones relacionadas