本文簡要介紹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 Psych.parse用法及代碼示例
- Ruby Psych.unsafe_load用法及代碼示例
- Ruby Psych.dump用法及代碼示例
- Ruby Psych.parse_stream用法及代碼示例
- Ruby Psych.dump_stream用法及代碼示例
- Ruby Psych.safe_load用法及代碼示例
- Ruby Psych.load_stream用法及代碼示例
- Ruby Psych.safe_dump用法及代碼示例
- Ruby PrettyPrint.current_group用法及代碼示例
- Ruby Pathname.<=>用法及代碼示例
- Ruby Pathname.children用法及代碼示例
- Ruby Process.groups用法及代碼示例
- Ruby Process.wait2用法及代碼示例
- Ruby Process.getpgrp用法及代碼示例
- Ruby Proc.eql?用法及代碼示例
- Ruby PTY.open用法及代碼示例
- Ruby PrettyPrint.genspace用法及代碼示例
- Ruby PKey.sign_raw用法及代碼示例
- Ruby Profiler模塊用法及代碼示例
- Ruby Process.setproctitle用法及代碼示例
- Ruby PPMethods.comma_breakable用法及代碼示例
- Ruby Process.setrlimit用法及代碼示例
- Ruby Proc.prc ==用法及代碼示例
- Ruby Profiler.raw_data用法及代碼示例
- Ruby Process.uid用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Psych模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。