我在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询问此问题,但他没有回复
答案 0 :(得分:0)
我们可以看到它有意义,因为
revive_hash
正在采用两个参数
您获得的错误与revive_hash
无关。
正如人们可能会在文档中看到的那样,Psych::Visitors::ToRuby#new
需要两个参数:ClassLoader
和ScalarScanner
。
您实例化ToRubyMerge
,它是上述的直接后代,根本不向initialize
提供任何参数。这正是你得到的错误所在。
要使用两者的默认值,可以使用#create
factory:
# ⇓⇓⇓⇓⇓⇓
ToRubyNoMerge.create.accept tree