如何使用YAML.load与处理程序

时间:2017-07-17 02:04:06

标签: ruby yaml

irb(main):001:0> a="run: yes"
 => "run: yes"
 irb(main):002:0> require 'yaml'
 => true
 irb(main):003:0> YAML.load a
 => {"run"=>true}
 irb(main):004:0> YAML.load(a, handlers => {'bool#yes' = identity})
 SyntaxError: (irb):4: syntax error, unexpected '=', expecting =>
 YAML.load(a, handlers => {'bool#yes' = identity})
                                      ^
    from /usr/bin/irb:11:in `<main>

我希望yaml val是的,我谷歌发现处理程序将有所帮助。 但似乎我没有使用正确的语法。 我尝试搜索相关文档但失败了。

1 个答案:

答案 0 :(得分:0)

列出的代码存在问题

  • handlers未在任何地方定义,您可能需要:handlers
  • identity未在任何地方定义,可能需要:identity
  • 您在哈希火箭(>)上遗漏了=>

因此要使这段代码运行它应该(可能)看起来像

YAML.load("run: yes", :handlers => {'bool#yes' => :identity})

但是,据我所知,YAML.load的第二个参数是文件名。

如果您能够更改输入YAML,只需引用值&#34; yes&#34;会导致它以字符串形式出现

YAML.load("a: 'yes'")
# => {"a"=>"yes"}

如果您需要未引用的字符串&#39;是&#39;在解析后,在YAML中被视为'yes',而不是true在ruby中。我使用this questionPsych::Handler将这些拼凑在一起(在Pysch::Parser的帮助下)。虽然我不确定是否还有另一种更简单/更好的方法来做到这一点,而不必像这样一起破解这一切。

require 'yaml'

class MyHandler < Psych::Handlers::DocumentStream
  def scalar(value, anchor, tag, plain, quoted, style)
    if value == 'yes'
      super(value, anchor, tag, plain, true, style)
    else
      super(value, anchor, tag, plain, quoted, style)
    end
  end
end

def my_parse(yaml)
  parser = Psych::Parser.new(MyHandler.new{|node| return node})
  parser.parse yaml

  false
end

my_parse("a: yes").to_ruby
# => {"a"=>"yes"}
my_parse("a: 'yes'").to_ruby
# => {"a"=>"yes"}
my_parse("a: no").to_ruby
# => {"a"=>false}

控制台中的旁注(and the source):

YAML
# => Psych