0

我正在学习 ruby​​ 并且对其中的编码相当陌生。下面是我为合并两个哈希并写入 YAML 文件而编写的厨师食谱。

 yaml_string = "AVG_METRICS: 
 get_requests:
 - OneMinuteRate
 - FifteenMinuteRate"

 trimmed_custom_hash = YAML.load(yaml_string)
 ruby_block do
     merger = proc do |key,v1,v2|
          Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2
     end
     block do
         if test_string.start_with? "7."
            default_hash = YAML.load_file(File.join('/opt/tests/metrics','metrics_test.yml'))
            default_hash.merge!(trimmed_custom_hash, &merger)
            File.open("/opt/tests/metrics/metrics_test.yml", "w") { |file| file.write(default_hash.to_yaml)}
         end
    end
end

我无法理解为什么会发生隐式转换错误。在考虑它可能失败的可能性时,我提出了一些问题。

  1. 这个块的返回值是多少?
  2. 如果 if 条件有“?”,那么该块应该只返回真还是假?
  3. 在 chef 中使用 ruby​​_block 时有什么需要记住的吗?

我一直试图弄清楚这一点。如果您能指出错误可能在哪里,那就太好了。谢谢!

4

1 回答 1

5

merge当在带有参数的哈希上调用时会引发这样的错误false

{}.merge(false)
#=> TypeError (no implicit conversion of false into Hash)

我希望错误出现在 linev1.merge(v2, &merger)default_hash.merge!(trimmed_custom_hash, &merger). 为什么会这样?很难说不知道如何trimmed_custom_hash定义。

以 an 结尾的方法?应该返回一个布尔值,这是一个常见的 Ruby 习惯用法。但我会依赖它,因为它只是一个约定,并且不是由语言本身强制执行的。

于 2018-08-11T05:35:20.067 回答