2011-12-13 9 views
6

Ho un array attributi come segue,Che cos'è l'oggetto Enumeratore? (Creato con stringa # gsub)

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

Quando faccio questo,

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

ottengo il seguente output nel terminale

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

Ti chiedi perché sto ottenendo un oggetto enumeratore come output? Grazie in anticipo.

MODIFICA: Si prega di notare che invece di attributes[-1].gsub("Photo:", ""), I am doing attributes[-1].gsub("Photo:") Quindi vorrei sapere perché l'oggetto enumeratore è tornato qui (mi aspettavo un messaggio di errore) e cosa sta succedendo.?

rubino - 1.9.2

Rotaie - 3.0.7

risposta

16

Un Enumerator oggetto fornisce alcuni metodi comuni per enumerazioni - next, each, each_with_index, rewind, ecc

che stai ricevendo il Enumerator oggetto qui perché gsub è estremamente flessibile:

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

Nei primi tre casi, la sostituzione può avvenire immediatamente e restituire una nuova stringa. Ma, se non si danno una stringa di sostituzione, un hash sostituzione o un blocco di sostituzioni, si ottiene indietro l'oggetto Enumerator che consente di ottenere per i pezzi corrispondenti della stringa di lavorare con più tardi:

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

quando viene fornita né un blocco né un secondo argomento, gsub restituisce un enumeratore. Guarda here per maggiori informazioni.

Per rimuoverlo è necessario un secondo parametro.

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

O

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

Spero che questo aiuti !!