2011-12-13 8 views
6

Mam tablicę atrybutów następująco,Co to jest obiekt Enumerator? (Utworzono sznurkiem # gsub)

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

Kiedy to zrobić,

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

uzyskać następujące wyjścia w terminalu

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

Zastanawiasz się, dlaczego otrzymuję obiekt modułu wyliczającego jako wynik? Z góry dziękuję.

EDYTOWANIE: Należy pamiętać, że zamiast attributes[-1].gsub("Photo:", ""), I am doing attributes[-1].gsub("Photo:") Więc chciałbym wiedzieć, dlaczego powrócił obiekt modułu wyliczającego (spodziewałem się komunikat o błędzie) i co się dzieje.?

Ruby - 1.9.2

Rails - 3.0.7

Odpowiedz

16

Enumerator obiekt udostępnia kilka metod wspólnych dla wyliczeń - next, each, each_with_index, rewind itd

dostajesz przedmiot Enumerator tutaj, ponieważ gsub jest niezwykle elastyczny:

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

W pierwszych trzech przypadkach podstawienie może nastąpić natychmiast i zwrócić nowy ciąg znaków. Jeśli jednak nie podasz zastępczego ciągu znaków, zastępczego skrótu lub bloku zastępczego, otrzymasz z powrotem obiekt Enumerator, który umożliwia uzyskanie dopasowanych fragmentów ciągu znaków do pracy z późniejszym:

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

Kiedy jest dostarczany ani blokiem ani drugi argument, gsub zwraca wyliczający. Zajrzyj here, aby uzyskać więcej informacji.

Aby go usunąć, potrzebny jest drugi parametr.

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

lub

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

Nadzieja to pomaga !!