ruby 检查散列是否为空值

zbsbpyhn  于 2022-12-03  发布在  Ruby
关注(0)|答案(4)|浏览(128)

我正在尝试分析Twitter上的tweet,其中一个我想包括的内容是位置。不幸的是,有些值为零,我一直得到错误

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

我只想运行一个检查,看看值是否为零,但我不能得到任何工作。
如果为零,则输入如下所示

tweet = {"metadata"=> {"geo"=>nil}}

如果它有价值

tweet = {"metadata"=> {"geo"=>{"coordinates"=>[0,1]}}

这就是我试过的

if "#{tweet['metadata']['geo']}".nil? == true
  puts("nil")
else
  puts("#{tweet['metadata']['geo']['coordinates']}"
end

我注意到它只是检查geo是否为空,因为如果我将if语句改为等于false,它将输出“nil”。

cgvd09ve

cgvd09ve1#

我认为问题可能是你在字符串中插入了哈希值,这将nil转换成了一个空字符串,实际上不是nil。
试试看:

if tweet['metadata']['geo'].nil?
  puts("nil")
else
  puts("#{tweet['metadata']['geo']['coordinates']}")
end
tzcvj98z

tzcvj98z2#

对散列使用fetch是处理这类问题的一种更好的方法。下面的另一个答案链接显示了如何优雅和漂亮地处理这一问题。Ruby - Access multidimensional hash and avoid access nil object

qv7cva1a

qv7cva1a3#

使用present?检查nilblank。使用以下代码进行检查。

if tweet['metadata']['geo'].present?
  puts("nil")
else
  puts("#{tweet['metadata']['geo']['coordinates']}")
end
q9yhzks0

q9yhzks04#

如果有人碰到这个问题,现在我建议使用dig,如果密钥不存在,则安全地返回nil。

tweet = { "metadata" => { "geo"=> { "coordinates" => [0, 1] } } }
tweet.dig("metadata", "geo", "coordinates")
=> [0, 1]

missing_tweet = { "metadata" => { "geo" => nil } }
missing_tweet.dig("metadata", "geo", "coordinates")
=> nil

相关问题