4

FooのサブクラスであるクラスがありますHash

class Foo < Hash
  # whatever Foo-specific methods/etc
end

YAMLでファイルにダンプすると、クラスを示すタグが書かれています。

> f = Foo.new
> f[:bar] = "baz"
> puts YAML.dump(f)
--- !ruby/hash:Foo
:bar: baz

単純な古いハッシュとして記述したいだけです( ではありません!ruby/hash:Foo

> puts YAML.dump({bar:"baz"})
---
:bar: baz

...私のデータの消費者が について知る必要がないようにFoo. クラスに追加してシリアル化用に変換する魔法のメソッド、または YAML.dump に渡す魔法のオプションはありますか?

もちろん、1 つのFooオブジェクトをハッシュに変換するのは簡単ですが、ダンプしたい実際のハッシュ内の任意のレベルでネストされて表示される可能性があり、検索と置換を行う必要はありません。

4

2 に答える 2

4

これは、(十分に文書化されていない)encode_withおよびrepresent_mapメソッドを使用して実現できます。オブジェクトの YAML シリアライゼーションをカスタマイズするには、オブジェクトencode_withを受け入れるメソッドを提供します。coderrepresent_map

class Foo < Hash

  # other methods ...

  def encode_with coder
    coder.represent_map nil, self
  end

end

オブジェクトYAML.dumpを通常のハッシュとして出力するだけです。

でも

これが失敗する原因となるバグがあり、Psych の最新の Gem バージョンでのみ修正されるため、少し問題があります。現在の最新の Ruby バージョン (ruby 2.0.0p247) では修正されていません。これは Ruby トランクで修正されているので、その後のパッチ リリースは問題ないはずです。

これを使用するには、Ruby にバンドルされているバージョンではなく、最新の Psych Gem を使用していることを確認する必要があります。これは次のように簡単なはずです

gem 'psych', '2.0.0'

Yaml を必要とする前に、しかし、Ruby 2.0 では、これは私が理解できない何らかの理由で機能しないようです。Gemfileただし、Bundler を使用して Gem のバージョンを指定することはできます。そのため、まだ使用していない場合は、Psychを作成して指定する必要があるかもしれません。

于 2013-08-12T02:51:12.017 に答える