Chef Ruby挖掘错误数量的参数

3

我想在Chef/Ruby中做一些非常简单的事情。 我只想以安全和干净的方式检查我的哈希表中的某个键是否为 nil

这是我的代码:

if node.dig('k1', 'k2', 'k3').nil?
  myvar1 = node['kA']['kB']['kC']
else
  myvar1 = node['k1']['k2']['k3']
end

然而,我遇到了一个“配方编译错误”(Recipe Compile Error),错误信息如下:
ArgumentError
-------------
wrong number of arguments (given 1, expected 0)

我在这里做错了什么?我已经阅读了关于 dig 的文档,链接地址为:http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig,但好像并没有起到帮助作用。

我的 Ruby 版本是 2.3。


1
看起来你正在使用的 dig 方法并非文档中所述的那个。node 是什么?它是一个普通的哈希还是其他什么东西?是否有任何代码补丁引入了另一个 dig 方法?查找的一种方法是:node.method(:dig).source_location - tadman
你确定错误是来自于你指定的代码行吗?这些调用都不可能不带任何参数。 - Keith Bennett
2
“(给定1,期望0)”- 您上面展示的方法被给予了3个参数,因此它不可能是错误的源头。完整的堆栈跟踪是什么?我认为您正在查看错误的代码行。 - Tom Lord
此外,node 不是一个 Hash,而是一个 Chef::Node,并且没有 dig 方法。因此,我假设这行代码根本就不会被执行,否则你会得到一个 NoMethodError 而不是 ArgumentError。如果想要 "dig",可能应该使用 node.attributes.dig - engineersmnky
2个回答

4

我们没有将它添加到上面节点支持的API中,因为它与现有的node.read方法重叠,这是你想在此处使用的方法。它看起来像一个哈希表,但只支持一部分方法。

编辑:现在我不在手机上,你需要的完整代码可能是:

node.read('k1', 'k2', 'k3') || node.read('kA', 'kB', 'kC')

除非“false”是有效的值。

2
原来node不是哈希,而是节点对象,因此.dig()无法使用。我最终使用了以下内容:
if node.read('k1', 'k2', 'k3').nil?
  myvar1 = node['kA']['kB']['kC']
else
  myvar1 = node['k1']['k2']['k3']
end

1
这是不正确的,您需要使用 node.read 而不是 node.attributes.read - coderanger
有什么区别吗? node.attributes.read 对我来说似乎很好用。 - Ryan
按照惯例,您不应直接访问node.attributes上的方法,因为它是一个内部对象。应使用从节点对象转发的任何公共方法。 - coderanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接