Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby数组#包含吗?给予命名者_Ruby_Arrays_Csv_Sakai - Fatal编程技术网

Ruby数组#包含吗?给予命名者

Ruby数组#包含吗?给予命名者,ruby,arrays,csv,sakai,Ruby,Arrays,Csv,Sakai,我有一些代码,在继续之前检查用户是否在“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 但我就是看不见

我有一些代码,在继续之前检查用户是否在“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
但我就是看不见

更新:

sakai_trained = []
  CSV.foreach(training_csv, {:headers => true}) do |trained|
    sakai_trained << trained
  end
酒井法子 foreach(training_CSV,{:headers=>true})做过训练|
sakai_-trained问题发生在标准Ruby库第478行的
csv.rb
文件中。以下是导致您出现问题的
CSV
代码:

#
# Returns +true+ if this row contains the same headers and fields in the
# same order as +other+.
#
def ==(other)
  @row == other.row
end
从错误消息的外观来看,字符串
“stuartademo”
正在传递到此方法中,当然,没有
字符串#行
。看起来
other
应该是csv文件的一行。根据对上述方法的评论,它应该包含标题和字段

我建议找到这个字符串
“stuartademo”
的来源,并找出为什么只传入字符串而不是整行

编辑:

如果从CSV填充
sakai\u trained
,则它不是数组,而是
CSV:Row
类型。在这种情况下,当您调用
CSV::Row#include?
时,将调用
=(其他)
。因此,您要传递的是,
行[1]
是一个字符串。它不应该是字符串

尝试使用
字段?(数据)
字段。包括?
,而不是使用
包含?

CSV.foreach(activation_csv, {:headers => true}) do |row|
  if sakai_trained
    row << 'Untrained' unless sakai_trained.field?(row[1]) 
  end

  course_list << row
end
CSV.foreach(activation_CSV,{:headers=>true})do|行|
如果酒井受过训练

行我认为这简化了一点逻辑,并可能帮助您以不同的方式跟踪问题

CSV.foreach(activation_csv, {:headers => true}) do |row|
  if sakai_trained && !sakai_trained.include?(row[1])
    row << 'Untrained'
  end

  course_list << row
end

我认为您的sakai_训练实际上是
nil
,这解释了为什么
sakai_训练。to_s
消除了错误。您不能对任何内容调用
include?
,但当您使用
时,它可能会将其转换为
,并返回false

这是因为我通过了第[1]行以包含?第[1]行是一个字符串。这不是重点吗?查看数组中是否有字符串?如果我传递整个数组,代码将运行,但该条件永远不会为真,因为sakai_训练的数组不包含来自activation_csv数组的任何整行。在
include?
方法中发生错误是没有意义的(即使错误消息是这样说的)因为
include?
方法永远不会调用
csv.rb
文件中的内容。让我仔细查看一下
csv.rb
文件。我一直在查找,似乎找不到调用
==(其他)
的地方,但这肯定是导致错误的原因
Array#include?
CSV::Row#从CSV文件填充您的
sakai\u-trained
更新更有意义。这就是调用
==(其他)
的地方。我已经更新了我的答案以反映这一点。@thekungfuman您的培训\u csv文件中的一行是什么样子的?您现在正在对它调用#to#s,但如果它有字段,并且您只测试一个字段,则需要提取该字段并将其字符串表示形式推入sakai#u。错误没有意义。第478行是哪一行?错误来自csv.rb,它是标准ruby库的一部分,而不是我的代码的一部分。我同意,这没有任何意义-_-向我们展示设置sakai_的代码。我怀疑填充到数组中的对象不是字符串,而是s,这就解释了为什么数组包含?正在计算。我不知道csv行没有作为字符串读入数组。我已经用相关的行更新了上面的帖子。尝试了一下,它抛出了完全相同的错误。在我的经验和测试中#包括?接受一个字符串,但由于某种原因,在这个csv#foreach循环中,它需要一行。不过,我喜欢逻辑的简化。你问ruby sakai_(某个对象)是否包含字符串。是可以检查的特定属性,而不是整个对象?或者sakai_训练过的已经是字符串了吗?sakai_训练过的是一个数组,我认为它充满了从不同的CSV读取的字符串(如原始更新帖子中所述)。尝试运行我更新的代码,查看所有不同的部分将非常有益。2124-5318,stuartademo CSV::Row stuartademo string NilClass 2124-5320,littletw CSV::Row bobsmith String NilClass 2124-4686,ossmerm CSV::Row jimsmith String NilClass 2124-3560,manzuetac CSV::Row tomsmith String NilClass 2124-3562,manzuetac CSV::Row jillsmith String NilClass 2124-5428,pleasantsg CSV::Row pleasantsg String NilClass是代码的输出,但请注意,我更新了sakai_trained代码,将trained.to_添加到了,而不是CSV行。
sakai_trained << trained.to_s
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
#
# Returns +true+ if this row contains the same headers and fields in the
# same order as +other+.
#
def ==(other)
  @row == other.row
end
CSV.foreach(activation_csv, {:headers => true}) do |row|
  if sakai_trained
    row << 'Untrained' unless sakai_trained.field?(row[1]) 
  end

  course_list << row
end
CSV.foreach(activation_csv, {:headers => true}) do |row|
  if sakai_trained && !sakai_trained.include?(row[1])
    row << 'Untrained'
  end

  course_list << row
end
CSV.foreach(activation_csv, {:headers => true}) do |row|
  puts row                   #=>  2124-5318,stuartademo
  puts row.class             #=>  CSV::Row 
  puts row[1]                #=>  stuartademo 
  puts row[1].class          #=>  String 
  puts sakai_trained         #=>  I'm assuming nil because it is of NilClass
  puts sakai_trained.class   #=>  NilClass
end