0

nil をチェックしようとしていますが、常に次のエラーが発生します。

undefined method `[]' for nil:NilClass (NoMethodError)

コード

require 'csv'
require 'addressable/uri'

lines = CSV.readlines("test.csv")

a = lines.map{|s| {timestamp: s[0], url: s[1], ip: s[2]} }

a.each do |data|
  if Addressable::URI.parse(data[:url]).query_values["v"].nil?
    puts "nil"
  else
    puts "not nil"
  end
end

ジョーの例から、これは私にとってうまくいったようです:

# test if each element exists
if data[:uri] = Addressable::URI.parse(data[:url]).query_values
  # test if the value "v" exists
  if Addressable::URI.parse(data[:url]).query_values["v"].nil?
    puts "nil"
  else
    # the value "v" exists, so parse it out
    puts "not nil"
    v = Addressable::URI.parse(data[:url]).query_values["v"]
    puts v
  end
else
  puts "no query values"
end

理解を深めるためにコメントを追加しました。

ありがとう。

4

3 に答える 3

1

使用する前に各要素が存在することをテストします[]

 if data and data[:uri] and Addressable::URI.parse(data[:url]).query_values 
         and not Addressable::URI.parse(data[:url]).query_values["v"].nil?
    puts "not nil"
 else
    puts "nil"
 end

2回の解析を避けるために、中間変数を割り当てる可能性があります

if data and data[:uri] and qv=Addressable::URI.parse(data[:url]).query_values 
   if qv["v"].nil?
      puts "nil"
   else
      puts "not nil"
   end
else 
   puts "no query values"
end
于 2013-08-14T05:59:12.357 に答える