2

以下のコード スニペットがあります。

   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

何か案が?

4

5 に答える 5

6

あなたの解決策のためにこの方法を試してください

tmp.collect! do |val|
  if val.present?   # or unless val.nil?
    val.gsub(line_sub, "")
  end
end
于 2012-11-09T06:31:11.310 に答える
2

このように1つの条件を追加します

     tmp.collect! do |val|
        if !val.nil?
           val.gsub(line_sub, "")
        end
     end
于 2012-11-09T06:35:53.167 に答える
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
于 2012-11-09T06:24:45.570 に答える
1

読んでいる行の 1 つが空であるか、'='文字が含まれていません。

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

#or
tmp[0], tmp[1] = []
# both are nil.
于 2012-11-09T06:28:54.780 に答える
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
于 2012-11-09T06:47:48.593 に答える