bug in YAML for Ruby?

M

Matt R.

I'm getting some strange behavior with YAML in ruby regarding the
characters '08' in a hash.

This code:
#
require 'yaml'
test = { "08" => '01', '01' => '08', '8' => '01'
}
File.open("test.yml", "w") {|f| YAML.dump(test, f)}
#

produces this file:
---
"01": 08
"8": "01"
08: "01"

I do not understand why the 08s are not quoted. I tried it under ruby
1.8.2 and 1.8.4.

Is this expected?

thanks,
-Matt
 
D

Daniel Harple

I'm getting some strange behavior with YAML in ruby regarding the
characters '08' in a hash.

This code:
#
require 'yaml'
test = { "08" => '01', '01' => '08', '8' => '01'
}
File.open("test.yml", "w") {|f| YAML.dump(test, f)}
#

produces this file:
---
"01": 08
"8": "01"
08: "01"

I do not understand why the 08s are not quoted. I tried it under ruby
1.8.2 and 1.8.4.

Is this expected?

It is not a bug, but it is confusing. According the the YAML spec[1]
numbers prefixed with a 0 signal an octal base (as does in Ruby).
However 08 is not a valid octal number, so it doesn't get quoted.

[1] http://yaml.org/type/int.html

-- Daniel
 
J

Joel VanderWerf

Matt said:
I'm getting some strange behavior with YAML in ruby regarding the
characters '08' in a hash.

This code:
#
require 'yaml'
test = { "08" => '01', '01' => '08', '8' => '01'
}
File.open("test.yml", "w") {|f| YAML.dump(test, f)}
#

produces this file:
---
"01": 08
"8": "01"
08: "01"

I do not understand why the 08s are not quoted. I tried it under ruby
1.8.2 and 1.8.4.

Is this expected?

I think so. The quotes are needed to disambiguate the string "01" from
the octal number. If quotes were not added by dump, then 01 would be
loaded as the fixnum 1 rather than the string "01". There's no ambiguity
with 08 because it is not legal octal, so it must be a string.

irb(main):004:0> YAML.load "foo: 08"
=> {"foo"=>"08"}
irb(main):005:0> YAML.load "foo: 07"
=> {"foo"=>7}
irb(main):006:0> YAML.load "foo: 017"
=> {"foo"=>15}

Note in the last case the conversion from octal.
 
L

Logan Capaldo

I'm getting some strange behavior with YAML in ruby regarding the
characters '08' in a hash.

This code:
#
require 'yaml'
test = { "08" => '01', '01' => '08', '8' => '01'
}
File.open("test.yml", "w") {|f| YAML.dump(test, f)}
#

produces this file:
---
"01": 08
"8": "01"
08: "01"

I do not understand why the 08s are not quoted. I tried it under ruby
1.8.2 and 1.8.4.

Is this expected?

thanks,
-Matt

Well just guessing here, but you don't have to quote 08 because it
couldn't be an octal number anyway, so it must be a string. I don't
know if this is why this happens or if this is what the YAML spec
says but it makes sense to me, sorta.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top