當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Ruby Psych模塊用法及代碼示例

本文簡要介紹ruby語言中 Psych模塊 的用法。

概述

Psych 是一個 YAML 解析器和發射器。 Psych 利用 libyaml [主頁:pyyaml.org/wiki/LibYAML] 或 [git repo:github.com/yaml/libyaml] 的 YAML 解析和發出函數。除了包裝 libyaml, Psych 還知道如何序列化和 de-serialize 大多數 Ruby 對象與 YAML 格式之間的往來。

我現在需要解析或發出 YAML

# Parse some YAML
Psych.load("--- foo") # => "foo"

# Emit some YAML
Psych.dump("foo")     # => "--- foo\n...\n"
{ :a => 'b'}.to_yaml  # => "---\n:a: b\n"

你有更多的時間嗎?繼續閱讀!

YAML 解析

Psych 提供了一係列用於解析 YAML 文檔的接口,範圍從低級到高級,具體取決於您的解析需求。在最低級別,是基於事件的解析器。中級是對原始 YAML AST 的訪問,最高級別是能夠將 YAML 解組為Ruby 對象。

YAML 發射

Psych 提供一係列從低級到高級的接口,用於生成 YAML 文檔。與 YAML 解析接口非常相似, Psych 在最低級別提供基於事件的係統,中級正在構建 YAML AST,最高級別是將Ruby 對象直接轉換為 YAML 文檔。

高級 API

解析

Psych 提供的高級 YAML 解析器隻需將 YAML 作為輸入並返回一個Ruby 數據結構。有關使用高級解析器的信息,請參閱 Psych.load

從字符串中讀取
Psych.safe_load("--- a")             # => 'a'
Psych.safe_load("---\n - a\n - b")   # => ['a', 'b']
# From a trusted string:
Psych.load("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n") # => 0..42
從文件中讀取
Psych.safe_load_file("data.yml", permitted_classes: [Date])
Psych.load_file("trusted_database.yml")
Exception 處理
begin
  # The second argument changes only the exception contents
  Psych.parse("--- `", "file.txt")
rescue Psych::SyntaxError => ex
  ex.file    # => 'file.txt'
  ex.message # => "(file.txt): found character that cannot start any token"
end

發射

高電平發射器具有最簡單的接口。 Psych 隻需采用 Ruby 數據結構並將其轉換為 YAML 文檔。有關轉儲 Ruby 數據結構的更多信息,請參閱 Psych.dump

寫入字符串
# Dump an array, get back a YAML string
Psych.dump(['a', 'b'])  # => "---\n- a\n- b\n"

# Dump an array to an IO object
Psych.dump(['a', 'b'], StringIO.new)  # => #<StringIO:0x000001009d0890>

# Dump an array with indentation set
Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n-  - b\n"

# Dump an array to an IO with indentation set
Psych.dump(['a', ['b']], StringIO.new, :indentation => 3)
寫入文件

目前沒有用於將 Ruby 結構轉儲到文件的直接 API:

File.open('database.yml', 'w') do |file|
  file.write(Psych.dump(['a', 'b']))
end

中級 API

解析

Psych 提供對通過解析 YAML 文檔生成的 AST 的訪問。這棵樹是使用 Psych::Parser Psych::TreeBuilder 構建的。 AST 可以自由地檢查和操作。請參閱 Psych::parse_stream Psych::Nodes Psych::Nodes::Node 以獲取有關處理 YAML 語法樹的更多信息。

從字符串中讀取
# Returns Psych::Nodes::Stream
Psych.parse_stream("---\n - a\n - b")

# Returns Psych::Nodes::Document
Psych.parse("---\n - a\n - b")
從文件中讀取
# Returns Psych::Nodes::Stream
Psych.parse_stream(File.read('database.yml'))

# Returns Psych::Nodes::Document
Psych.parse_file('database.yml')
Exception 處理
begin
  # The second argument changes only the exception contents
  Psych.parse("--- `", "file.txt")
rescue Psych::SyntaxError => ex
  ex.file    # => 'file.txt'
  ex.message # => "(file.txt): found character that cannot start any token"
end

發射

中層是構建 AST。此 AST 與解析 YAML 文檔時使用的 AST 完全相同。用戶可以手動構建 AST,並且 AST 知道如何將自己作為 YAML 文檔發出。有關構建 YAML AST 的更多信息,請參閱 Psych::Nodes Psych::Nodes::Node Psych::TreeBuilder

寫入字符串
# We need Psych::Nodes::Stream (not Psych::Nodes::Document)
stream = Psych.parse_stream("---\n - a\n - b")

stream.to_yaml # => "---\n- a\n- b\n"
寫入文件
# We need Psych::Nodes::Stream (not Psych::Nodes::Document)
stream = Psych.parse_stream(File.read('database.yml'))

File.open('database.yml', 'w') do |file|
  file.write(stream.to_yaml)
end

低級 API

解析

YAML 輸入已知並且開發人員不想支付構建 AST 或自動檢測和轉換為 Ruby 對象的代價時,應使用最低級別的解析器。有關使用基於事件的解析器的更多信息,請參閱 Psych::Parser

讀取 Psych::Nodes::Stream 結構
parser = Psych::Parser.new(TreeBuilder.new) # => #<Psych::Parser>
parser = Psych.parser                       # it's an alias for the above

parser.parse("---\n - a\n - b")             # => #<Psych::Parser>
parser.handler                              # => #<Psych::TreeBuilder>
parser.handler.root                         # => #<Psych::Nodes::Stream>
接收事件流
recorder = Psych::Handlers::Recorder.new
parser = Psych::Parser.new(recorder)

parser.parse("---\n - a\n - b")
recorder.events # => [list of [event, args] lists]
                # event is one of: Psych::Handler::EVENTS
                # args are the arguments passed to the event

發射

最低級別的發射器是一個基於事件的係統。事件被發送到 Psych::Emitter 對象。該對象知道如何將事件轉換為 YAML 文檔。當事先知道文檔格式或速度是一個問題時,應使用此接口。有關詳細信息,請參閱 Psych::Emitter

寫入 Ruby 結構
Psych.parser.parse("--- a")       # => #<Psych::Parser>

parser.handler.first              # => #<Psych::Nodes::Stream>
parser.handler.first.to_ruby      # => ["a"]

parser.handler.root.first         # => #<Psych::Nodes::Document>
parser.handler.root.first.to_ruby # => "a"

# You can instantiate an Emitter manually
Psych::Visitors::ToRuby.new.accept(parser.handler.root.first)
# => "a"

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Psych模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。