簡體   English   中英

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

[英]undefined method `gsub' for nil: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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM