2011-12-13 29 views
6

Tôi có một mảng các thuộc tính như sau,Đối tượng liệt kê là gì? (Created với gsub String #)

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

Khi tôi làm điều này,

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

tôi nhận được đầu ra sau trong terminal

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

Tự hỏi tại sao tôi nhận được một đối tượng điều tra là đầu ra? Cảm ơn trước.

EDIT: Xin lưu ý rằng thay vì attributes[-1].gsub("Photo:", ""), I am doing attributes[-1].gsub("Photo:") Vì vậy, muốn biết lý do tại sao điều tra viên đã trở lại đây (tôi đã mong đợi một thông báo lỗi) và những gì đang diễn ra.

Ruby - 1.9.2

Rails - 3.0.7

Trả lời

16

Một Enumerator đối tượng cung cấp một số phương pháp phổ biến để enumerations - next, each, each_with_index, rewind vv

Bạn đang gặp Enumerator đối tượng ở đây vì gsub là cực kỳ linh hoạt:

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

Trong ba trường hợp đầu tiên, sự thay thế có thể diễn ra ngay lập tức và trả về một chuỗi mới. Tuy nhiên, nếu bạn không cung cấp chuỗi thay thế, mã băm thay thế hoặc khối thay thế, bạn sẽ lấy lại đối tượng Enumerator cho phép bạn truy cập vào các phần phù hợp của chuỗi để làm việc sau:

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

Khi không phải là một khối hay một cuộc tranh luận thứ hai được cung cấp, gsub trả về một điều tra viên. Hãy xem here để biết thêm thông tin.

Để xóa nó, bạn cần tham số thứ hai.

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

Hoặc

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

Hope this helps !!

Các vấn đề liên quan