コード
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árBalázsに感謝します。ただし、Ruby 1.8.7(2009-04-08パッチレベル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
この醜いハックはトリックをするようです...
class Array
def to_yaml_style
:inline
end
end
Rubyのソースを閲覧していると、同じことを実現するために渡すことができるオプションが見つかりません。デフォルトのオプションは lib/yaml/constants.rb で説明されています。
ハッシュオプションについて: 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が必要)
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
出力スタイルを指定するためのもう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
Rubyの最新バージョンはYAML解析にPsychモジュールを使用します。渡すことができるオプションは多くありませんが、インデントと線幅を変更できます。最新の Psychドキュメントを確認してください) 詳細については。