本文简要介绍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模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。