14

自 ruby​​ 1.9.3 以来,Psych 是默认的 yaml 引擎

为什么,哦,为什么 psych 会在其输出中添加换行符?检查下面的示例。

ruby -v # => ruby 1.9.3p374 (2013-01-15 revision 38858) [x86_64-linux]
require 'yaml'

"this absolutely normal sentence is more than eighty characters long because it IS".to_yaml
# => "--- this absolutely normal sentence is more than eighty characters long because it\n    IS\n...\n"

YAML::ENGINE.yamler = 'syck'

"this absolutely normal sentence is more than eighty characters long because it IS".to_yaml
# => "--- this absolutely normal sentence is more than eighty characters long because it IS\n"
4

3 回答 3

18

您必须配置 psych 的 #to_yaml 选项。您很可能会在这里找到它:

ruby-1.9.3-p125/ext/psych/emitter.c

然后你可以做这样的事情:

yaml.to_yaml(options = {:line_width => -1})
于 2013-07-25T14:09:36.263 回答
9
yaml.to_yaml(options = {:line_width => -1})

可以解决问题。

RuboCop

对变量的无用赋值 - 选项。

所以

yaml.to_yaml(line_width: -1)

更好。

于 2015-10-21T10:14:59.003 回答
-2

为什么 YAML 在序列化数据时是否换行很重要?

问题是,在包装之后,YAML 可以在稍后重新加载文件时重建正确的行吗?而且,答案是,是的,它可以:

require 'yaml'
puts '"' + YAML.load("this absolutely normal sentence is more than eighty characters long because it IS".to_yaml) + '"'

哪个输出:

"this absolutely normal sentence is more than eighty characters long because it IS"

已序列化的数据采用 YAML 可以理解的格式。这是一个重要的概念,因为此时数据是 YAML 的。我们可以在编辑器中处理它,添加/减去/编辑,但数据仍然是 YAML 的,因为它必须重新加载和重新解析数据才能让我们的应用程序使用它。所以,在数据通过 YAML-land 来回往返之后,如果数据以与离开时相同的形式返回,则一切正常。

如果它在解析阶段被序列化然后损坏,我们就会遇到问题,但这不会发生。

您可以修改 YAML 的一些 Psych 驱动程序在序列化数据时的行为。有关更多信息,请参阅“ Psych to_yaml 选项的文档? ”的答案。

于 2013-07-25T14:01:27.500 回答