是否可以在ruby中为to_yaml指定格式化选项?

ans*_*hul 23 ruby yaml

代码

require 'yaml'
puts YAML.load("
is_something:
  values: ['yes', 'no']
").to_yaml
Run Code Online (Sandbox Code Playgroud)

产生

--- 
is_something: 
  values: 
  - "yes"
  - "no"
Run Code Online (Sandbox Code Playgroud)

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

可以传递选项哈希, to_yaml但是如何使用它?

编辑0:感谢PozsárBalázs.但是,从ruby 1.8.7(2009-04-08 patchlevel 160)开始,选项哈希不像宣传的那样工作.:(

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
Run Code Online (Sandbox Code Playgroud)

Bal*_*sár 13

关于哈希选项:请参阅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
Run Code Online (Sandbox Code Playgroud)

防爆.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)

  • 不行.从源代码来看,我甚至不确定opts哈希是否被传递给syck. (20认同)

小智 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
Run Code Online (Sandbox Code Playgroud)


ans*_*hul 6

这个丑陋的黑客似乎成功了......

class Array
  def to_yaml_style
    :inline
  end
end
Run Code Online (Sandbox Code Playgroud)

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

  • 仅打印内联的小数组:class Array; def to_yaml_style(); self.length <5?:内联:超级; 结束 (3认同)