Bug #5358
closedYAML 中のタグの扱いについて
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 はグローバルタグとして扱われていない
Updated by tenderlovemaking (Aaron Patterson) about 13 years ago
- 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 >
Updated by sho-h (Sho Hashimoto) about 13 years ago
ありがとうございます。確かに教えてもらった通りになりました。
上記はつまり以下という事でいいですか?
- !str は Ruby では特別扱いする(ただのローカルタグとして扱う)
- !tag:yaml.org,2002:str foo は Ruby では特別扱いする(扱わない)
Updated by shyouhei (Shyouhei Urabe) over 12 years ago
- Status changed from Open to Assigned
Updated by ayumin (Ayumu AIZAWA) over 12 years ago
- Status changed from Assigned to Closed
報告者が納得されているようなのでこのチケットはCloseします。
Updated by sho-h (Sho Hashimoto) over 12 years ago
アーロンさんにご返信をいただいてないので納得というと何ともですが、close していただくのは問題ありません。
私としては、以下の質問に対してRubyの仕様として公式なご回答が頂けるとるりまに反映しやすいくらいでした。
上記はつまり以下という事でいいですか?
- !str は Ruby では特別扱いする(ただのローカルタグとして扱う)
- !tag:yaml.org,2002:str foo は Ruby では特別扱いする(扱わない)
以下の「注意点」に上記が書いてありますので、間違いにお気づきの方がいらっしゃいましたら、るりまのチケットとして別途発行してやってくださいませ。:)