检查没有?

时间:2013-08-14 05:40:25

标签: ruby

我正在尝试检查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

我添加了评论以补充我的理解。

感谢。

3 个答案:

答案 0 :(得分:1)

dataAddressable::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