2017-07-17 4 views
0
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が欲しいと思っています。私はハンドラが助けになるとわかります。 しかし、私は正しい構文を使用していないようです。 関連するドキュメントを検索しようとしましたが失敗します。ハンドラでYAML.loadを使用する方法

答えて

0

記載されたコードに問題があなたはおそらく、handlersがどこにも定義されていないことを

  • あるidentityがどこにも定義されていないことを:handlers
  • を望んでいたが、多分あなたが欠けている:identity
  • ことを望んでいましたハッシュロケットの>=>)。

だから(おそらく)私の知る限りYAML.load 2番目のパラメータがファイル名で、

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

のようになります。それを実行するには、このコードを取得します。あなたは、単に値を引用し、入力YAMLを変更することができるならば、あなたはYAMLで非引用符で囲まれた文字列を「はい」が必要な場合

は、「はい」が文字列

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

として通ってくる原因になります解析後のルビではとして処理され、trueではありません。私はPsych::HandlerPysch::Parserを使って一緒に(this questionの助けを借りて)これを洞くじしました。私はこのようにすべてを一緒にハックすることなくこれを行うより簡単で良い方法があるかどうかはわかりませんが。コンソールで

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 
関連する問題