我正在学习红宝石,并且在其中进行编码还很新。下面是我编写的厨师食谱,用于合并两个哈希并写入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
我无法理解为什么发生隐式转换错误。在考虑可能出现故障的可能性时,我提出了一些问题。
一段时间以来,我一直在试图解决这个问题。如果您能指出错误所在,那将是很棒的。谢谢!
答案 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习惯用法,即以?
结尾的方法应返回布尔值。但是我会依靠它,因为它只是一个约定,并且不是由语言本身强制执行的。