当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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