0

如何通过这种方式定义 ruby​​ 哈希?

default['mgmt']['query'] = {
    'default_interval' => {'diff' => 3600, 'snapshot' => 86400 * 7},
    'tables' => {
        'deb_packages' => default_interval,
        'rpm_packages' => default_interval,
        ...
    }
}

编辑:上面的代码是厨师食谱的attributes/default.rb

我正在寻找一种方法来定义 Hash 内的 default_interval 并且能够被其他字段引用,以便 default_interval 可以被其他 Chef 方法(例如环境 json)覆盖。

这就是为什么我不选择简单地定义一个全局 default_interval var 的原因。

目前,我使用以下定义来表示 default_interval

default['mgmt']['query'] = {
    'default_interval' => {'diff' => 3600, 'snapshot' => 86400 * 7},
    'tables' => {
        'deb_packages' => {} # default_interval,
        'rpm_packages' => {} # default_interval,
        ...
    }
}

空的{}可以被环境json等其他主厨手段覆盖改成{diff: 600, snapshot:86400}

有更好的酷方法吗?

4

2 回答 2

1

这就是为什么我不选择简单地定义一个全局 default_interval var 的原因。

不需要,你可以定义一个局部变量。

default['mgmt']['query'] = {
    'default_interval' => (default_interval = {'diff' => 3600, 'snapshot' => 86400 * 7}),
    'tables' => {
        'deb_packages' => default_interval,
        'rpm_packages' => default_interval,
    }
}

这种风格在红宝石中不是很常见,并且保证会引起一些人的注意,但它可以满足您的需求。

于 2018-03-30T13:24:27.900 回答
-1

声明node

node = Hash.new { |h, k| h[k] = {} }

并且您的代码将按原样执行,生成您需要的结构。后者在 ruby​​ 中被命名为“hash”。

Hash#new有关接受块的更多信息。

于 2018-03-28T07:59:52.863 回答