未定义的方法`gsub'代表nil:NilClass(NoMethodError

时间:2012-11-09 06:20:54

标签: ruby-on-rails ruby

我有以下代码段:

   line_sub = Regexp.new(/\s+|"|\[|\]/)
   tmp = Array.new
    # reading a file
   while line = file.gets
     ... 
     tmp[0],tmp[1] = line.to_s.scan(/^.*$/).to_s.split('=')
    #remove unwanted characters
     tmp.collect! do |val|
       val.gsub(line_sub, "")
     end
    ...
   end

但是当我运行代码时出现错误:

 undefined method `gsub' for nil:NilClass (NoMethodError)

这里似乎有些错误:

tmp.collect! do |val|
 val.gsub(line_sub, "")
end

有什么想法吗?

5 个答案:

答案 0 :(得分:5)

为您的解决方案尝试这种方式

tmp.collect! do |val|
  if val.present?   # or unless val.nil?
    val.gsub(line_sub, "")
  end
end

答案 1 :(得分:1)

这意味着tmp[0]和/或tmp[1]nil。您的

line.to_s.scan(/^.*$/).to_s.split('=')

没有按预期工作。更好地检查该部分的结果。

顺便说一下,line.to_s.scan(/^.*$/).to_s没有意义。如果您想处理文件的每一行,请执行

file.each_line do |l|
  ...
  l ...
end

答案 2 :(得分:1)

您正在阅读的其中一行是空的,或者它不包含'='个字符。

#Then, you get either
tmp[0], tmp[1] = ["only one element"]
# => tmp[1] = nil

#or
tmp[0], tmp[1] = []
# both are nil.

答案 3 :(得分:1)

添加一个这样的条件

     tmp.collect! do |val|
        if !val.nil?
           val.gsub(line_sub, "")
        end
     end

答案 4 :(得分:0)

如果该行中“=”的每一侧都应该有一个值,例如"foo=bar"而不是"foo=",那么请尝试以下方法:

line.match(/(.+)=(.+)/ do |match|
  # do whatever you need with the match
  # if there is no match this block won't be executed
  tmp = match[1..2]
  tmp.map! do |string|
    string.gsub(/[\s"\[\]/, "")
  end
end
相关问题