2011-06-27 17 views
34

Ésta es mi matriz:Aplicar el método para cada elemento en la matriz/enumerables

array = [:one,:two,:three] 

quiero aplicar to_s método a todos mis elementos de la matriz para obtener array = ['one','two','three'].

¿Cómo puedo hacer esto (convirtiendo cada elemento del enumerable en algo más)?

+0

Posible duplicado de [¿Convertir una matriz de enteros en una matriz de cadenas en Ruby?] (Http://stackoverflow.com/questions/781054/convert-an-array-of-integers-into-an-array- of-strings-in-ruby) – Nakilon

Respuesta

57

Esto funcionará:

array.map!(&:to_s) 
+2

array.map! (&: to_s) - ¿Esto no funciona en 1.8 también? –

+0

Claramente funciona en Ruby 1.8.7. Lo uso en todos mis proyectos. –

+0

Símbolo # to_proc no estaba disponible en 1.8.6, pero está disponible en 1.8.7: http://apidock.com/ruby/Symbol/to_proc. Lo sé por experiencia personal, ya que no uso Rails o sus bibliotecas. –

15

Usted puede utilizar map o map! respectivamente, la primera devolverá una nueva lista, la segunda modificará la lista en contexto:

>> array = [:one,:two,:three] 
=> [:one, :two, :three] 

>> array.map{ |x| x.to_s } 
=> ["one", "two", "three"] 
+0

¡Gracias por una respuesta rápida y detallada! –

7
  • array.map!(&:to_s) modifica la matriz original a ['one','two','three']
  • array.map(&:to_s) devuelve la arra y ['one','two','three'].
+0

@sawa: En realidad, eso no es cierto. Ruby-On-Rails es en realidad un lenguaje de programación, con más preguntas sobre el tema que sobre Ruby. Pero al igual que Perl, CLU y SmallTalk, Ruby ha incorporado las mejores partes de este en su lenguaje. ;) http://xkcd.com/386/ –

+0

@ Andrew Ok. Gracias. Eliminé mi comentario justo antes de dar algunos. – sawa

+0

Para aquellos que se preguntan a qué respondí graciosamente, @sawa básicamente preguntó si el contestador sabía que Ruby es un lenguaje, y que Rails es un framework que funciona con Ruby, porque @sawa pensó que Symbol # to_proc era Rails-only en 1.8 .7. –

15

Vale la pena señalar que si se tiene una matriz de objetos que desea pasar individualmente en un método de comunicación con un interlocutor diferente, como esto:

# erb 
<% strings = %w{ cat dog mouse rabbit } %> 
<% strings.each do |string| %> 
    <%= t string %> 
<% end %> 

Usted puede utilizar el método method combinado con la expansión del bloque comportamiento para simplificar:

<%= strings.map(&method(:t)).join(' ') %> 

Si usted no está familiarizado, lo que hace es method encapsula el método asociado con el símbolo que se le pasa en un Proc y lo devuelve. El ampersand expande este Proc en un bloque, que pasa a map bastante bien. El retorno de map es una matriz, y es probable que desee formatearlo un poco más, por lo tanto, el join.

La advertencia es que, como con Symbol#to_proc, no puede pasar argumentos al método de ayuda.

+0

Gracias, este es un truco muy bueno! – antinome

Cuestiones relacionadas