記載されたコードに問題があなたはおそらく、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::HandlerとPysch::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