1

で動的yaml fileにしていますRuby

私は次のハッシュを持っています

{
  "defaults"=>
          {"foo"=>"bar", "zip"=>"button"},
           "node"=>
                  {
                   "<<"=>
                  {"foo"=>"bar", "zip"=>"button"}, 
                   "foo"=>"other"
                   }
}

を使用して解析しようとすると

tree = Psych.parse your_data
data = ToRubyNoMerge.new.accept tree

ここのようにパーサー関数をオーバーライドする

require 'psych'
class ToRubyNoMerge < Psych::Visitors::ToRuby
  def revive_hash hash, o
    if o.anchor
      @st[o.anchor] = hash
      hash.instance_variable_set "@_yaml_anchor_name", o.anchor
    end

    o.children.each_slice(2) { |k,v|
      key = accept(k)
      hash[key] = accept(v)
    }
    hash
  end
end

class MyEmitter < Psych::Visitors::Emitter
  def visit_Psych_Nodes_Mapping o
    o.anchor = 'defaults' if o.anchor
    super
  end

  def visit_Psych_Nodes_Alias o
    o.anchor = 'defaults' if o.anchor
    super
  end
end

今私がしようとすると

tree = Psych.dump yaml_constants
data = ToRubyNoMerge.new.accept tree
File.open(file, 'w') { |f| YAML.dump(data.to_yaml, f) }

以下のエラーが表示されます

psych/visitors/to_ruby.rb:23:`initialize' で: 引数の数が間違っています (指定された 0、予想される 2) (ArgumentError)

revive_hashは2 つの引数を取りますが、同じことがこの連中に対しても機能したため、理にかなっていることがわかります。誰が私が間違っているのか教えてもらえますか

注:解析のためにこの投稿をフォローしており、@matt にこの問題について尋ねましたが、彼は応答していません

4

1 に答える 1

0

revive_hashは2 つの引数を取るため、意味があることがわかります。

発生しているエラーは とは関係ありませんrevive_hash

ドキュメントを読むとわかるように、とのPsych::Visitors::ToRuby#new2 つのパラメーターが必要です。ClassLoaderScalarScanner

ToRubyMerge上記の直接の子孫である をインスタンス化し、パラメータをまったく提供しませんinitialize。これはまさにあなたが得るエラーが言っていることです。

両方のデフォルトを使用するには、#createfactoryを使用できます。

#             ⇓⇓⇓⇓⇓⇓
ToRubyNoMerge.create.accept tree
于 2016-07-08T05:51:10.067 に答える