2011-09-08 13 views
106

¿Existe alguna manera más clara de hacer algo como esto?Crear una matriz de símbolos

%w[address city state postal country].map(&:to_sym) 
#=> [:address, :city, :state, :postal, :country] 

me hubiera imaginado %s habría hecho lo que quería, pero no es así. Simplemente toma todo entre paréntesis y lo convierte en un gran símbolo.

Sólo una pequeña molestia.

+0

¿Qué es 'dir ty 'sobre esto? –

+1

Eso es bastante estándar. ¿Hay algo acerca de su implementación que hace que este método sea indeseable? – dwhalen

+4

No es "realmente", pero Rails a menudo tiene azúcar sintáctica como esta que me hace sentir un poco caliente por dentro al usarla. :) – Drew

Respuesta

309

Escribí la respuesta original en septiembre '11, pero starting from Ruby 2.0 hay una forma más corta de crear una serie de símbolos. Este literal:

%i(address city state postal country) 

hace exactamente lo que quiere.

+0

¡Impresionante! Pensé que algo así aparecería eventualmente. – Drew

+7

Solo para actualizar, esto ES parte de Ruby 2.0.0 –

+3

Siempre me olvido que significa "interno" una alternativa a "to_sym". Consulte http://www.codecademy.com/forum_questions/512a675cf116c52d0d00674b – A5308Y

82

Con el riesgo de volverse demasiado literal, creo que la forma más limpia de construir una serie de símbolos es usando una serie de símbolos.

fields = [:address, :city, :state, :postal, :country] 

No se puede pensar en nada más conciso que eso.

+4

+1, simple y directo al grano. –

+9

¿Quiere decir "demasiado literal"? –

+0

Siempre me gusta encontrar y usar las formas más poderosas y concisas de hacer las cosas. Esta respuesta es en realidad menos teclas que la mía para esta lista en particular, pero con una lista de ~ 9 o más elementos, una alternativa sería más corta. Gracias por la respuesta. :) – Drew

0

%i[ ] matriz no interpolada de símbolos, separadas por espacios en blanco (después de Ruby 2,0)

%I[ ] conjunto interpolado de símbolos, separadas por espacios en blanco (después de Ruby 2,0)

%i[address city state postal country]

la manera más limpia para hacer esto es:

%w[address city state postal country].map(&:to_sym)