2014-11-04 36 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