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.

Dibujó
fuente
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.

Joost Baaij
fuente
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.

Joost Baaij
fuente
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)

askrynnikov
fuente