Ruby 为什么可以';从CSV行对象访问信息时是否使用点符号?

Ruby 为什么可以';从CSV行对象访问信息时是否使用点符号?,ruby,csv,ruby-csv,Ruby,Csv,Ruby Csv,我试图循环浏览一个CSV文件并打印出行中的信息。我有两列标题为“description”和“status”。如果我循环浏览CSV文件,我会得到一系列的CSV不是这样工作的,但您可以使用: 或者只需创建一个符合您需要的自定义类,例如通过: 为什么您希望任意类(CSV::Row在本例中)响应您选择的任意方法(description)?该类作者实现了#[]方法,但没有费心实现所有的访问器。“为什么不能用点表示法访问它?”–CSV头和同名方法之间会发生冲突。@Stefan fwiw,这种冲突的产生方式与

我试图循环浏览一个CSV文件并打印出行中的信息。我有两列标题为“description”和“status”。如果我循环浏览CSV文件,我会得到一系列的
CSV
不是这样工作的,但您可以使用:

或者只需创建一个符合您需要的自定义类,例如通过:


为什么您希望任意类(
CSV::Row
在本例中)响应您选择的任意方法(
description
)?该类作者实现了
#[]
方法,但没有费心实现所有的访问器。“为什么不能用点表示法访问它?”–CSV头和同名方法之间会发生冲突。@Stefan fwiw,这种冲突的产生方式与类似哈希的访问方式完全相同,是吗?@mudasobwa你什么意思<代码>任务['index']
指的是名为
索引的头,而不是方法。我看不出有冲突。@Stefan啊,我现在明白了。我认为您指的是由于输入中有两个或多个相同的头而导致方法名冲突的情况。
CSV.foreach(@file.path, headers:true) do |task|
    check_box = task["status"] == 0 ? "[ ] " : "[X] "
    puts check_box + task["description"]
end
require 'ostruct'

CSV.foreach(@file.path, headers: true) do |row|
  task = OpenStruct.new(row.to_hash)
  check_box = task.status == '0' ? '[ ]' : '[X]'
  puts "#{check_box} #{task.description}"
end
Task = Struct.new(:status, :description) do
  def checkbox
    status == 0 ? '[ ]' : '[X]'
  end

  def to_s
    "#{checkbox} #{description}"
  end
end

CSV_OPTIONS = { headers: true, header_converters: :symbol, converters: :numeric }
CSV.foreach(@file.path, CSV_OPTIONS) do |row|
  task = Task.new(row[:status], row[:description])
  puts task
end