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