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是的,我谷歌发现处理程序将有所帮助。 但似乎我没有使用正确的语法。 我尝试搜索相关文档但失败了。
答案 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 question和Psych::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