2010-08-14 6 views

Odpowiedz

11

pomocą modułu 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

Powoduje to powrót Syck :: Map (lub podobnych obiektów), a nie skrótów. Jakikolwiek sposób na przywrócenie (lub konwersję) zwykłego Hash ruby? – elsurudo

85

chciałbym użyć czegoś takiego:

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

Również w Rubim 2.2 symbole są oznaczone GC. – Kris

+0

[Moja odpowiedź] (https://stackoverflow.com/a/45068104/3042952) jest oparta na tym jednym, z wyjątkiem tego, że jest prostszy i odrobinę bardziej czytelny przy użyciu YAML.load_file. –

2

może napotkasz problem wspomnianego na this related question, a mianowicie, że plik lub strumień YAML określa obiekt, do którego będzie próbował użyć moduł ładujący YAML przekonwertuj dane na. Problem polega na tym, że będziesz potrzebował odpowiedniego Gem, który wie o danym obiekcie.

Moje rozwiązanie było dość trywialne i stanowi odpowiedź na to pytanie. Zrób to:

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

W zasadzie usuniesz tekst klasyfikatora obiektów z tekstu yaml. Następnie analizujesz/ładujesz go.

6

Prostsza wersja odpowiedzi Venables':

hash = YAML.load_file("file_path")