[英]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.