Ruby 未定义的方法'id';对于nil:对象集合的NilClass

Ruby 未定义的方法'id';对于nil:对象集合的NilClass,ruby,Ruby,这是我的密码: class Train attr_accessor :id, :person_id, :movie_id, :eval def initialize(id, person_id, movie_id, eval) @id = id @person_id = person_id @movie_id = movie_id @eval = eval end end trains = Array.new CSV.open('train.csv'

这是我的密码:

class Train
  attr_accessor :id, :person_id, :movie_id, :eval
  def initialize(id, person_id, movie_id, eval)
    @id = id
    @person_id = person_id
    @movie_id = movie_id
    @eval = eval
  end
end

trains = Array.new
CSV.open('train.csv', encoding: "BOM|UTF-16LE:UTF-8", row_sep: :auto, col_sep: ';') do    |csv|
  csv.each do |id, person_id, movie_id, eval|
    trains[id.to_i] = Train.new(id.to_i, person_id.to_i, movie_id.to_i, eval.to_i)
  end
end

trains.each do |t|
  puts t.id
end
它只是从CSV文件创建一个对象数组,并打印对象的ID,但我得到一个错误:

undefined method `id' for nil:NilClass

为什么当我使用
put t
打印对象时
t
为nil。

您正在初始化数组,但随后通过指定索引添加到trains数组。如果csv中的id从1(或101)开始,则索引0到第一个索引将初始化为nil


尝试使用
trains好的,我找到了,第一个元素(trains[0])是nil…欢迎使用堆栈溢出。请花点时间阅读。它越容易阅读和理解,我们就能更快更好地帮助你。是的,这就是我在评论中给出的,我发现第一个元素是零。您的解决方案可能很好,但我想使用id来选择每列火车,例如,如果我想得到一列id为5的火车,我只使用火车[5]。在您的解决方案中,它不会以这种方式工作。无论如何,谢谢你的帮助。:)我对答案进行了编辑,为您提供了一种不同的存储类型,以实现您使用ID进行索引的目标。在这里使用哈希会更好。是的,这是真的,在大多数情况下,哈希会更好,在我的情况下,我需要数组,但这是特定的情况。
trains = Hash.new
CSV.open('train.csv', encoding: "BOM|UTF-16LE:UTF-8", row_sep: :auto, col_sep: ';') do |csv|
  csv.each do |id, person_id, movie_id, eval|
    trains[id.to_i] = Train.new(id.to_i, person_id.to_i, movie_id.to_i, eval.to_i)
  end
end
trains.each do |t|
  puts t.id if t
end