2010-08-14 64 views

回答

11

使用YAML模塊:
http://ruby-doc.org/stdlib-1.9.3/libdoc/yaml/rdoc/YAML.html

node = YAML::parse(<<EOY) 
one: 1 
two: 2 
EOY 

puts node.type_id 
# prints: 'map' 

p node.value['one'] 
# prints key and value nodes: 
# [ #<YAML::YamlNode:0x8220278 @type_id="str", @value="one", @kind="scalar">, 
#  #<YAML::YamlNode:0x821fcd8 @type_id="int", @value="1", @kind="scalar"> ]' 

# Mappings can also be accessed for just the value by accessing as a Hash directly 
p node['one'] 
# prints: #<YAML::YamlNode:0x821fcd8 @type_id="int", @value="1", @kind="scalar"> 

http://yaml4r.sourceforge.net/doc/page/parsing_yaml_documents.htm

+7

這往往會返回Syck :: Map(或類似的對象),而不是哈希值。任何方式讓它返回(或轉換爲)一個普通的紅寶石哈希? – elsurudo 2013-04-21 19:37:13

85

我會使用類似:

hash = YAML.load(File.read("file_path")) 
+0

同樣在Ruby 2.2中,符號是GC'd。 – Kris 2015-05-26 13:05:21

+0

[我的答案](https://stackoverflow.com/a/45068104/3042952)是基於這個,除了它使它更簡單,並且通過使用YAML.load_file來代替更具可讀性。 – 2017-08-29 19:44:28

2

您可能會遇到在this related question,即提到一個問題,那YAML文件或流指定YAML加載器將嘗試訪問的對象將數據轉換爲。問題是你需要一個相關的Gem來了解有關的對象。

我的解決方案非常簡單,並作爲該問題的答案提供。這樣做:

yamltext = File.read("somefile","r") 
yamltext.sub!(/^--- \!.*$/,'---') 
hash = YAML.load(yamltext) 

本質上,您從yaml文本中剝離了對象分類器文本。然後你解析/加載它。

6

一個簡單的版本維納布爾斯回答:

hash = YAML.load_file("file_path")