如何处理Ruby find命令return undefined方法`[]' for nil:nilclass(nomethoderror)

lrpiutwd  于 10个月前  发布在  Ruby
关注(0)|答案(2)|浏览(94)

我使用Ruby find命令从Puppet数据库中收集我需要的信息,如下所示。

vm_name = puppetdb.find { |details| details['certname']==(hostname) and details['name'] == 'az_metadata' }['value']['compute']['name']

字符串
有些参数没有'az_metadata'参数,这会导致find函数显示“undefined method `[]' for nil:nil class(no method error)”。我如何处理这些或未定义的方法值?
我如何处理这些或未定义的方法值从查找结果为该特定变量?

hs1ihplo

hs1ihplo1#

从错误中可以看出,结果中某个键的值似乎是nil
您可以使用挖掘方法或安全导航操作员

# dig
data = puppetdb.find {|details| details['certname']==(hostname) and details['name']=='az_metadata'}
vm_name = data.dig('value','compute','name')

# Safe Navigation
data = puppetdb.find {|details| details['certname']==(hostname) and details['name']=='az_metadata'}
vm_name = data&.['value']&.['compute']&.['name']

字符串

cig3rfwq

cig3rfwq2#

有些参数没有'az_metadata'参数,这会导致find函数显示“undefined method []' for nil:nil class(no method error)”。我如何处理这些或未定义的方法值? 在尝试访问其元素之前,测试结果是否为nil`?在Ruby 2.0中执行此操作的方法比其他版本少,但您可能能够使用的任何版本都应该接受这一点:

result = puppetdb.find { |details| details['certname']==(hostname) and details['name'] == 'az_metadata' }

vm_name = result.nil? ? nil : result['value']['compute']['name']

字符串
当然,对于puppetdb.find返回nil的情况,您可以使用不同的默认值。
当然,如果你不能依靠结果得到一个'value',而得到一个'compute',那么问题又会出现,你可能需要多次执行上述操作。
或者,如果你的范围足够窄,那么拯救NoMethodError也是合理的:

result = puppetdb.find { |details| details['certname']==(hostname) and details['name'] == 'az_metadata' }

begin
  vm_name = result['value']['compute']['name']
rescue NoMethodError
  vm_name = nil
end


但是,请注意,这会使nil变得模糊不清,并且它也会捕获结果或其他中间值之一不是nil但也没有[]方法的情况。

相关问题