所以我有这段代码:
data = CSV.open(filename, headers: true, header_converters: :symbol)
@contents = data.map
filename是文件的路径,指的是我计算机上的实际文件。
我的问题是我命名数据的CSV对象究竟是什么?如何通过对象进行映射?
当我使用pry进行调试时,我看到了:
[1] pry(#<Session>)> data
=> <#CSV io_type:File io_path:"./data/event_attendees.csv" encoding:UTF-8 lineno:2 col_sep:"," row_sep:"\n" quote_char:"\"" headers:[:_, :regdate, :first_name, :last_name, :email_address, :homephone, :street, :city, :state, :zipcode]>
[2] pry(#<Session>)> row
CSV::Row _:"1" regdate:"11/12/08 10:47" first_name:"Allison" last_name:"Nguyen" email_address:"arannon@jumpstartlab.com" homephone:"6154385000" street:"3155 19th St NW" city:"Washington" state:"DC" zipcode:"20010"
因此数据似乎是指CSV对象而不是数组。 row似乎是指csv对象的某些属性?
无论哪种方式,我以前都没见过对象上的方法图。发生了什么事?
答案 0 :(得分:2)
map
适用于包含Enumerable
mixin的任何对象。为了使用Enumerable
,该类需要提供each
- 这是构建所有其他好方法的基础。正如您在the documentation for the class中所看到的,CSV
类的对象符合此模式。
(之所以没有将它直接推入数组是因为能够逐行读取输入文件而不是在使用它之前将整个内容存储在内存中是很好的。)