24

编码

require 'yaml'
puts YAML.load("
is_something:
  values: ['yes', 'no']
").to_yaml

生产

--- 
is_something: 
  values: 
  - "yes"
  - "no"

虽然这是一个正确的 yaml,但当你有一个数组散列时它看起来很丑。有没有办法让我to_yaml生成 yaml 的内联数组版本?

可以将选项哈希传递给 to_yaml但你如何使用它?

编辑 0:感谢 Pozsár Balázs。但是,从 ruby​​ 1.8.7 (2009-04-08 patchlevel 160) 开始,options hash 不能像宣传的那样工作。:(

irb
irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
--- 
- - Crispin
  - Glover
=> nil
4

5 回答 5

11

关于哈希选项:参见http://yaml4r.sourceforge.net/doc/page/examples.htm

前任。24:to_yaml与选项哈希一起使用

puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
#   --- %YAML:1.0
#   -
#       - Crispin
#       - Glover

前任。25:选项哈希的可用符号

Indent:发射时使用的默认缩进(默认为2
Separator:文档之间使用的默认分隔符(默认为'---'
SortKeys:发射时对哈希键进行排序?(默认为false
UseHeader:发出时显示 YAML 标头?(默认为false
UseVersion:发出时显示 YAML 版本?(默认为false
AnchorFormat:发射时锚点 ID 的格式化字符串(默认为 ' id%03d')
ExplicitTypes:发射时使用显式类型?(默认为false
BestWidth:折叠文本时使用的字符宽度(默认为80
UseFold:发射时强制折叠文本?(默认为false
UseBlock:在发射时强制所有文本为文字?(默认为false
Encoding: 用于编码的 Unicode 格式(默认为:Utf8; 需要 Iconv)

于 2009-06-28T12:32:20.227 回答
8

从 Ruby 1.9 开始,psych它被用作默认的 YAML 引擎。它支持一些属性:http ://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html

所以对我来说它有效:

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> puts [{'a'=> 'b', 'c'=> 'd'}, {'e'=> 'f', 'g'=>'h'}].to_yaml(:indentation => 4)
---
-   a: b
    c: d
-   e: f
    g: h
于 2016-08-26T09:31:22.800 回答
6

这个丑陋的黑客似乎可以解决问题......

class Array
  def to_yaml_style
    :inline
  end
end

浏览 ruby​​ 的源代码,我找不到任何可以通过的选项来实现相同的目标。默认选项在lib/yaml/constants.rb中描述。

于 2009-06-28T12:37:35.333 回答
1

只是另一种指定输出样式的技巧,但是这个方法允许根据特定对象自定义它,而不是全局(例如所有数组)。

https://gist.github.com/jirutka/31b1a61162e41d5064fc

简单的例子:

class Movie
  attr_accessor :genres, :actors

  # method called by psych to render YAML
  def encode_with(coder)
    # render array inline (flow style)
    coder['genres'] = StyledYAML.inline(genres) if genres
    # render in default style (block)
    coder['actors'] = actors if actors
  end
end
于 2014-08-13T13:46:05.410 回答
0

最新版本的 Ruby 使用 Psych 模块进行 YAML 解析。您可以通过的选项不多,但您可以更改缩进和线宽。查看最新的Psych 文档以获取更多详细信息。

于 2019-07-08T15:04:03.827 回答