2012-05-23 28 views
6

Das sollte ziemlich einfach sein, aber es explodiert. Irgendwelche Ideen?BigDecimal kann nicht in BigDecimal umgewandelt werden

d = BigDecimal.new("2.0") 
YAML::load({:a => d}.to_yaml) 
TypeError: BigDecimal can't be coerced into BigDecimal 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in `inspect' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in `inspect' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:86:in `block in <module:IRB>' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:30:in `call' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/inspector.rb:30:in `inspect_value' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/context.rb:260:in `inspect_last_value' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:311:in `output_value' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:160:in `block (2 levels) in eval_input' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:273:in `signal_status' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:155:in `eval_input' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:70:in `block in start' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:69:in `catch' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb.rb:69:in `start' 
from /Users/benjohnson/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'Maybe IRB bug! 
+0

Hmmm, sieht aus wie 'to_yaml' ist auf BigDecimal,' BigDecimal.new ("2.0") verwirrt. to_yaml' sagt '" ---! ruby ​​/ object: BigDecimal {} \ n \ n "'. –

+1

Ja. 'ActiveSupport' scheint eine Kernerweiterung dafür hinzuzufügen, aber auf meiner Plattform bekomme ich' BigDecimal.new ("2.0"). To_yaml' -> '" --- 2.0 \ n "'. Obwohl es besser funktioniert, wird es immer noch nicht in ein vollständiges 'BigDecimal' konvertiert: http://apidock.com/rails/BigDecimal/to_yaml – Casper

Antwort

1

Dies ist ein Fehler, der reported und fixed gewesen.

Die beste Lösung wäre ein Upgrade auf den neuesten Ruby (der Patch liegt ab Patch 194 vor).

Wenn Sie Ihre Ruby-Version nicht aktualisieren können, können Sie das Update erhalten, indem Sie die Psych gem installieren. Wenn Sie dies tun, müssen Sie gem 'psych', bevor Sie require 'yaml' (oder fügen Sie sie Gemfile wenn Sie Bündler verwenden) fügen Sie den Code aus dem Edelstein zu laden, anstatt aus der Standardbibliothek ..

0

Ja, ich lief einmal in diese. Hier ist eine Version von dem, was ich getan habe:

YAML & BigDecimal workaround

+0

Leider funktioniert diese Lösung nicht mehr. Ich bin auf Ruby 1.9.3 –

0

Hier ist David Antwort, aktualisiert this related question in 1.9.3 dank arbeiten:

require 'yaml' 
require 'bigdecimal' 
YAML::ENGINE.yamler= 'syck' 
class BigDecimal 
    def to_yaml(opts={}) 
    YAML::quick_emit(object_id, opts) do |out| 
     out.scalar("tag:induktiv.at,2007:BigDecimal", self.to_s) 
    end 
    end 
end 
YAML.add_domain_type("induktiv.at,2007", "BigDecimal") do |type, val| 
    BigDecimal.new(val) 
end 
x = BigDecimal.new("2.0") 
puts x.to_yaml 
y = YAML.load(x.to_yaml) 
puts x == y