2011-12-13 14 views
6

tengo una matriz atributos de la siguiente manera,¿Qué es el objeto Enumerator? (Creado con la cadena # gsub)

attributes = ["test, 2011", "photo", "198.1 x 198.1 cm", "Photo: Manu PK Full Screen"] 

cuando hago esto,

artist = attributes[-1].gsub("Photo:") 
p artist 

i obtener la siguiente salida en el terminal

#<Enumerator: "Photo: Manu PK Full Screen":gsub("Photo:")> 

¿Te preguntas por qué recibo un objeto enumerador como salida? Gracias por adelantado.

EDITAR: Tenga en cuenta que en lugar de attributes[-1].gsub("Photo:", ""), I am doing attributes[-1].gsub("Photo:") ¿Quiere saber por qué el objeto del enumerador ha regresado aquí (esperaba un mensaje de error) y qué está sucediendo?

Ruby - 1.9.2

carriles - 3.0.7

Respuesta

16

Un Enumerator objeto proporciona algunos métodos comunes para las enumeraciones - next, each, each_with_index, rewind, etc.

que está recibiendo el objeto Enumerator aquí porque gsub es extremadamente flexible:

gsub(pattern, replacement) → new_str 
gsub(pattern, hash) → new_str 
gsub(pattern) {|match| block } → new_str 
gsub(pattern) → enumerator 

En los primeros tres casos, la sustitución puede tener lugar inmediatamente y devolver una nueva cadena. Sin embargo, si usted no da una cadena de reemplazo, un hash de reemplazo, o un bloque para los reemplazos, a recuperar el objeto Enumerator que le permite llegar a las piezas coincidentes de la cadena para trabajar con más adelante:

irb(main):022:0> s="one two three four one" 
=> "one two three four one" 
irb(main):023:0> enum = s.gsub("one") 
=> #<Enumerable::Enumerator:0x7f39a4754ab0> 
irb(main):024:0> enum.each_with_index {|e, i| puts "#{i}: #{e}"} 
0: one 
1: one 
=> " two three four " 
irb(main):025:0> 
5

Cuando se suministra ni un bloque ni un segundo argumento, gsub devuelve un empadronador. Mire here para más información.

Para eliminarlo, necesita un segundo parámetro.

attributes[-1].gsub("Photo:", "") 

O

attributes[-1].delete("Photo:") 

Espero que esto ayude !!

Cuestiones relacionadas