###############################
xxx:~ piergiulianobossi$ ./set_yaml.rb
/opt/local/lib/ruby/1.8/yaml.rb:133:in load': syntax error on line 3, col -1: name: one (ArgumentError)
: true
!ruby/object:U ?
name: two
: true
’ from /opt/local/lib/ruby/1.8/yaml.rb:133:in `load’
from ./set_yaml.rb:30
###############################
What am I doing wrong?
As far as I can tell (I’m not a YAML expert), no. I’ve made a few
trials, and
it seems that class Hash (which is used internally by Set), has problems
with
loading / dumping when keys are custom classes. For instance, using irb
(ruby -v gives ruby 1.8.5 (2006-12-25 patchlevel 12) [i686-linux], on
gentoo)
:
require ‘yaml’
=> true
class C
end
=> nil
c=C.new
=> #<C:0xb78bd5b4>
h={c=>‘test’}
=> {#<C:0xb78bd5b4>=>“test”}
str=YAML.dump h
=> “— \n!ruby/object:C ? {}\n: test\n\n”
h1=YAML.load str
ArgumentError: syntax error on line 2, col -1: `: test
’
from /usr/lib/ruby/1.8/yaml.rb:133:in load' from /usr/lib/ruby/1.8/yaml.rb:133:in load’
from (irb):7
YAML can’t convert the string it just produced to a Hash. I’ve been able
(with
blind trials and using the documentation at http://yaml4r.sourceforge.net/cookbook/, in particular the section on
ranges)
to modify the string produced by dump to make it load again. The
original
string is:
!ruby/object:C ? {}
: test
The modified one is:
? !ruby/object:C {}
: test
It seems that the problem arises from the fact that the dump puts the ?
(which, if I understand correctly, should mark a hash key) after the
type of
the object (the !ruby/object:C part), while load (correctly, I think)
wants
it before the type.
As far as I can tell (I’m not a YAML expert), no. I’ve made a few trials, and
it seems that class Hash (which is used internally by Set), has problems with
loading / dumping when keys are custom classes. For instance, using irb
(ruby -v gives ruby 1.8.5 (2006-12-25 patchlevel 12) [i686-linux], on gentoo)
: