我正在尝试检查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
从Joe的例子来看,这似乎对我有用:
# 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
我添加了评论以补充我的理解。
感谢。
答案 0 :(得分:1)
data
或Addressable::URI.parse(data[:url]).query_values
似乎是nil
,因此您无法访问nil?
。
答案 1 :(得分:1)
我建议您查看#fetch
如果密钥不存在则会引发错误。使用[]
可能会返回nil
,而nil
会导致其他地方出现错误,导致您难以调试。
在您的情况下,data[:url]
或query_values
可能会返回nil
。
答案 2 :(得分: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
可能分配一个中间变量以避免解析两次
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