2010-08-14 26 views

Trả lời

11

Sử dụng các module 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

Điều này có xu hướng trả về Syck :: Bản đồ (hoặc các đối tượng tương tự), không phải là băm. Bất kỳ cách nào để có nó trở lại (hoặc chuyển đổi sang) một Hash ruby ​​thường xuyên? – elsurudo

85

Tôi sẽ sử dụng một cái gì đó như:

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

Cũng trong các biểu tượng Ruby 2.2 là GC'd. – Kris

+0

[Câu trả lời của tôi] (https://stackoverflow.com/a/45068104/3042952) được dựa trên điều này, ngoại trừ nó làm cho nó đơn giản và dễ đọc hơn bằng cách sử dụng YAML.load_file thay thế. –

2

Bạn có thể chạy vào một vấn đề nêu tại this related question, cụ thể là, tệp hoặc luồng YAML chỉ định một đối tượng mà trình tải YAML sẽ cố gắng chuyển đổi dữ liệu thành. Vấn đề là bạn sẽ cần một Gem liên quan biết về đối tượng được đề cập.

Giải pháp của tôi khá tầm thường và được cung cấp dưới dạng câu trả lời cho câu hỏi đó. Thực hiện việc này:

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

Thực chất, bạn tách văn bản phân loại đối tượng khỏi văn bản yaml. Sau đó, bạn phân tích/tải nó.

6

Một phiên bản đơn giản của câu trả lời Venables':

hash = YAML.load_file("file_path") 
Các vấn đề liên quan