【发布时间】:2012-05-02 08:07:33
【问题描述】:
我有一些代码在继续之前检查用户是否在“sakai_trained”数组中。出于某种原因,当我运行此代码时:
CSV.foreach(activation_csv, {:headers => true}) do |row|
if sakai_trained
row << 'Untrained' unless sakai_trained.include?(row[1])
end
course_list << row
end
我收到此错误
C:/Ruby193/lib/ruby/1.9.1/csv.rb:478:in `==': undefined method `row' for "stuartademo":String (NoMethodError)
from activate-courses.rb:42:in `include?'
from activate-courses.rb:42:in `block in <main>'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1792:in `each'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1354:in `open'
from C:/Ruby193/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
from activate-courses.rb:40:in `<main>'
起初我以为 row[1] 有问题,但即使使用字符串文字也会以相同的方式中断。我检查以确保 sakai_trained 数组存在并且其中也有数据。我还尝试将其重写为 if 语句,以防除非逻辑有缺陷,但也会返回相同的错误。
如果不清楚,我想在将行添加到 course_list 数组之前检查位于 row[1] 中的用户 ID 是否存在于 sakai_trained 数组中。如果没有,我希望先将“未训练”添加到行中,然后将行添加到数组中。当我删除 unless... 部分时,我能够获得一个完整的 course_list 数组,但正如预期的那样,每一行都有“未经训练”。问题似乎出在
unless sakai_trained.include?(row[1])
部分,但我只是看不到它。
更新:
sakai_trained = []
CSV.foreach(training_csv, {:headers => true}) do |trained|
sakai_trained << trained
end
我应该#map!那么每个项目都带有 .to_s 来把它们变成字符串呢?
更新 2:
我变了
sakai_trained << trained
到
sakai_trained << trained.to_s
它已经消除了错误,但输出仍然不太正确。
更新 3: 几乎。工作中。 你们都非常棒,尽管如此令人沮丧,但我学到了一些新的有趣的东西。
代码:
course_list = []
if options[:verify]
sakai_trained = []
CSV.foreach(training_csv, {:headers => true}) do |trained|
sakai_trained << trained.to_s
end
end
CSV.foreach(activation_csv, {:headers => true}) do |row|
if sakai_trained && !sakai_trained.include?(row[1])
row << 'Untrained'
end
course_list << row
end
产量:
2124-5318,stuartademo,未受过训练
2124-5320,鲍勃史密斯,未受过训练
2124-4686,吉姆史密斯,未受过训练
2124-3560,吉尔史密斯,未受过训练
2124-3562,苏史密斯,未受过训练
2124-5428,哈里史密斯,未受过训练
应该是什么时候
2124-5318,stuartademo,未受过训练
2124-5320,鲍勃史密斯
2124-4686,吉姆史密斯
2124-3560,吉尔史密斯
2124-3562,苏史密斯
2124-5428,哈里史密斯
【问题讨论】:
-
这个错误没有意义。第 478 行是哪一行?
-
错误来自 csv.rb,它是标准 ruby 库的一部分,而不是我的代码的一部分,如 below. 所示,我同意,这没有任何意义。 -_-
-
向我们展示设置 sakai_trained 的代码。我怀疑填充到其中的对象不是字符串,而是CSV::Rows,这就解释了为什么 Array#include?正在评估CSV::Row#==。
-
我不知道 csv 行没有作为字符串读入数组。我已经用相关行更新了上面的帖子。