ToRubyNoMerge参数错误 - Psych - Yaml Parser - ruby​​ on rails

时间:2016-07-08 01:33:56

标签: ruby-on-rails ruby ruby-on-rails-4 yaml psych

我在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&#39;:错误的参数数量(给定0,预期为2)(ArgumentError)

我们可以看到它是有道理的,因为revive_hash有两个参数,但同样的事情适用于This人。任何人都可以告诉我我做错了什么

注意:我关注This Post for parsing并向@matt询问此问题,但他没有回复

1 个答案:

答案 0 :(得分:0)

  

我们可以看到它有意义,因为revive_hash正在采用两个参数

您获得的错误与revive_hash无关。

正如人们可能会在文档中看到的那样,Psych::Visitors::ToRuby#new需要两个参数:ClassLoaderScalarScanner

您实例化ToRubyMerge,它是上述的直接后代,根本不向initialize提供任何参数。这正是你得到的错误所在。

要使用两者的默认值,可以使用#create factory:

#             ⇓⇓⇓⇓⇓⇓
ToRubyNoMerge.create.accept tree