nil的未定义方法`gsub’:NilClass(NoMethodError

我有以下代码片段:

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 

任何的想法?

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

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

这意味着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 

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

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

像这样添加一个条件

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

如果行中“=”的每一侧都应该有一个值,比如"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