Bug #5358
closed
Added by sho-h (Sho Hashimoto) almost 13 years ago.
Updated over 12 years ago.
Description
http://yaml.org/ によると、以下はいずれも同じグローバルタグを指定してると思うのですが、結果が異なります。
YAML.load("--- !tag:yaml.org,2002:str foo")
=> #<YAML::DomainType:0xf71d4780 @domain="yaml.org,2002", @type_id="tag:yaml.org,2002:str", @value="foo">¶
YAML.load("--- !!str foo")
=> #<YAML::PrivateType:0xf71e0a44 @type_id="str", @value="foo">¶
一方、以下はいずれも同じ結果になります。
YAML.load("--- foo") # => "foo"
YAML.load("--- !str foo") # => "foo"
YAML.load("--- !tag:yaml.org,2002:str foo") # => "foo"
これらについて、もしかして以下のバグがあるのではないでしょうか。
- !str は間違ってグローバルタグとして扱われている
- !tag:yaml.org,2002 は間違ってグローバルタグとして扱われている
- !!str はグローバルタグとして扱われていない
- Category set to ext
- Assignee set to tenderlovemaking (Aaron Patterson)
- Target version set to 1.9.3
これは syck のバグです。Ruby 1.9.2 で最初に require 'psych' と書いてから、require 'yaml' と書けば、バグは発生しません。
例:
ruby-1.9.2-p290 :001 > RUBY_VERSION
=> "1.9.2"
ruby-1.9.2-p290 :002 > require 'psych'
=> true
ruby-1.9.2-p290 :003 > require 'yaml'
=> true
ruby-1.9.2-p290 :004 > YAML.load("--- foo")
=> "foo"
ruby-1.9.2-p290 :005 > YAML.load("--- !str foo")
=> "foo"
ruby-1.9.2-p290 :006 > YAML.load("--- !tag:yaml.org,2002:str foo")
=> "foo"
ruby-1.9.2-p290 :007 > YAML.load("--- !!str foo")
=> "foo"
ruby-1.9.2-p290 :008 > YAML.load("--- !tag:yaml.org,2002:str foo")
Psych::SyntaxError: couldn't parse YAML at line 1 column 24
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in parse' from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in
parse_stream'
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:119:in parse' from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:106:in
load'
from (irb):8
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `'
ruby-1.9.2-p290 :009 >
Ruby 1.9.3 を使ったら、require 'yaml' だけで良いです。
例:
ruby-1.9.3-head :001 > RUBY_VERSION
=> "1.9.3"
ruby-1.9.3-head :002 > require 'yaml'
=> true
ruby-1.9.3-head :003 > YAML.load("--- foo")
=> "foo"
ruby-1.9.3-head :004 > YAML.load("--- !str foo")
=> "foo"
ruby-1.9.3-head :005 > YAML.load("--- !tag:yaml.org,2002:str foo")
=> "foo"
ruby-1.9.3-head :006 > YAML.load("--- !!str foo")
=> "foo"
ruby-1.9.3-head :007 > YAML.load("--- !tag:yaml.org,2002:str foo")
Psych::SyntaxError: (): couldn't parse YAML at line 0 column 24
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:154:in parse' from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:154:in
parse_stream'
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:125:in parse' from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:112:in
load'
from (irb):7
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/bin/irb:16:in `'
ruby-1.9.3-head :008 >
ありがとうございます。確かに教えてもらった通りになりました。
上記はつまり以下という事でいいですか?
- !str は Ruby では特別扱いする(ただのローカルタグとして扱う)
- !tag:yaml.org,2002:str foo は Ruby では特別扱いする(扱わない)
- Status changed from Open to Assigned
- Status changed from Assigned to Closed
報告者が納得されているようなのでこのチケットはCloseします。
アーロンさんにご返信をいただいてないので納得というと何ともですが、close していただくのは問題ありません。
私としては、以下の質問に対してRubyの仕様として公式なご回答が頂けるとるりまに反映しやすいくらいでした。
上記はつまり以下という事でいいですか?
- !str は Ruby では特別扱いする(ただのローカルタグとして扱う)
- !tag:yaml.org,2002:str foo は Ruby では特別扱いする(扱わない)
以下の「注意点」に上記が書いてありますので、間違いにお気づきの方がいらっしゃいましたら、るりまのチケットとして別途発行してやってくださいませ。:)
http://doc.ruby-lang.org/ja/1.9.3/library/yaml.html
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0