2014-11-04 37 views
0
从YAML文件

我读变量:如何在yaml文件中未声明从yaml文件读取的变量时引发异常?

begin 
    settings = YAML.load_file 'vm.yaml' 

    $var_a = settings['var_a'] 
    $var_b = settings['var_b'] 
    .... 
    $var_z = settings['var_z'] 

rescue 
    puts "\nInvalid vm.yaml - please create or recreate vm.yaml from vm.yaml.example\n\n" 
    exit 1 
end 

puts $var_a 

如果变量没有在vm.yaml文件中设置,将不会被检测到的误差,直到可变第一次被访问(例如,在puts $var_a)。

最好是,如果在yaml文件中没有设置变量,我希望执行rescue块中的代码。

什么是最宝贵的方式来做到这一点?

回答

3

使用fetch取代[]来访问散列数据。

所以不是settings['var_a']settings.fetch('var_a')

默认情况下,如果该键不存在,这将产生一个错误。但是,fetch方法也会使用一个可选块,如果找不到密钥,该块将被执行。

这可以让你设置一个默认的返回值: settings.fetch('var_a') { 'foo' }

或者创建自定义失败消息:

settings.fetch('var_a') { fail "Key var_a was not found, please add it to the yaml" }

+1

@DaneAnderson - 谢谢!如何获取嵌套元素?例如。 'var_a_a = settings ['var_a'] ['a']' – 2014-11-04 21:36:54

+1

鉴于您正在从yaml文件加载数据,您可能正在使用嵌套散列。开始时他们可能有点困难,但是在它的核心,这意味着对方法'settings.fetch('var_a')'的回应是一个散列,所以你可以继续使用[ ]或获取以获取返回的散列值,使其成为'settings.fetch('var_a')。fetch('a')' – 2014-11-04 21:40:07