Crea una matriz de símbolos


130

¿Hay una forma más limpia de hacer algo como esto?

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

Me habría imaginado %sque habría hecho lo que quería, pero no lo hace. Simplemente toma todo entre los corchetes y lo convierte en un gran símbolo.

Solo una molestia menor.


1
Eso es bastante estándar. ¿Hay algo en su implementación que haga que este método sea indeseable?
dwhalen

55
No "realmente", pero Rails a menudo tiene azúcar sintáctica como esta que me hace sentir un poco de calor por el uso. :)
Drew

desde ruby ​​2, hay! ver stackoverflow.com/questions/8816877/…
m_x

Respuestas:


357

La respuesta original se escribió en septiembre del '11, pero, a partir de Ruby 2.0 , ¡hay una forma más corta de crear una serie de símbolos! Este literal:

%i[address city state postal country]

Hará exactamente lo que quieras.


3
Siempre olvido que significa "interno", una alternativa a "to_sym". Ver codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y

Tenga en cuenta el énfasis de ruby ​​2. Esto no se muestra en el libro del lenguaje de programación Ruby porque solo cubre hasta 1.9.3.
Donato

Cuando uso la sintaxis literal% de ruby, prefiero usar dos caracteres no alfanuméricos en lugar de corchetes, es decir%i|a b c|
Epigene

66
Si bien esto hace lo que quieres, cualquiera que vea esto en tu base de código tendrá que buscarlo en Google para descubrir qué extraña sintaxis nos ha lanzado Ruby esta vez. Recomiendo evitar las características oscuras del lenguaje cuando existen alternativas perfectamente legibles, es decir, [: dirección,: ciudad,: estado].
Alex

Gracias, esto es realmente útil.
sonnyhe2002

91

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

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

No se me ocurre nada más conciso que eso.


11
¿Quieres decir "demasiado literal"?
Andrew Grimm

Siempre me gusta encontrar y usar las formas más poderosas y concisas de hacer las cosas. Esta respuesta es en realidad menos pulsaciones de 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

44
Creo que la legibilidad triunfa sobre todo en este caso. Esta respuesta es MUCHO más legible (IMO) que la alternativa% w / to_sym. No hagas que el próximo desarrollador que se haga cargo de tus cosas quiera golpearte en la garganta.
Bruce Hubbard

3

%i[ ] Matriz de símbolos no interpolada, separados por espacios en blanco (después de Ruby 2.0)

%I[ ] Matriz de símbolos interpolada, separados por espacios en blanco (después de Ruby 2.0)

%i[address city state postal country]

La forma más limpia de hacer esto es:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.