TypeError:没有将false隐式转换为Hash

时间:2018-08-11 05:19:45

标签: ruby chef yaml

我正在学习红宝石,并且在其中进行编码还很新。下面是我编写的厨师食谱,用于合并两个哈希并写入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条件具有“?”,那么该块应该只返回true还是false?
  3. 在Chef中使用ruby_block时,我需要记住哪些要点?

一段时间以来,我一直在试图解决这个问题。如果您能指出错误所在,那将是很棒的。谢谢!

1 个答案:

答案 0 :(得分:5)

在以merge作为参数的散列上调用false时会引发这样的错误:

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

我希望错误出现在v1.merge(v2, &merger)行或default_hash.merge!(trimmed_custom_hash, &merger)行中。为什么会发生?不知道如何定义trimmed_custom_hash很难说。

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