2012-05-23 12 views
6

में शामिल नहीं किया जा सकता है यह बहुत आसान होना चाहिए, फिर भी यह उड़ रहा है। कोई विचार?BigDecimal को BigDecimal

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

, की तरह दिखता है 'to_yaml' बिगडिसीमल पर उलझन में है, 'BigDecimal.new (" 2.0 ")। to_yaml' कहता है" ---! ruby ​​/ object: BigDecimal {} \ n \ n "'। –

+1

हां। 'ActiveSupport' इस के लिए एक कोर एक्सटेंशन जोड़ता है, लेकिन मेरे प्लेटफ़ॉर्म पर मुझे' BigDecimal.new ("2.0") मिलता है। To_yaml' -> '" --- 2.0 \ n "'। तो हालांकि यह बेहतर काम करता है, फिर भी यह एक पूर्ण 'BigDecimal' में परिवर्तित नहीं होता है: http://apidock.com/rails/BigDecimal/to_yaml – Casper

उत्तर

1

यह एक बग है कि reported और fixed रहा है।

सबसे अच्छा समाधान नवीनतम रूबी में अपग्रेड किया जाएगा (फिक्स पैच स्तर 1 9 4 के बाद में है)।

यदि आप अपने रूबी संस्करण को अपग्रेड नहीं कर सकते हैं, तो आप Psych gem इंस्टॉल करके ठीक कर सकते हैं। आप ऐसा करते हैं तो आप आप require 'yaml' से पहले gem 'psych' जोड़ने के लिए (या अपने Gemfile में जोड़ने अगर तुम Bundler उपयोग कर रहे हैं) मणि से बजाय मानक पुस्तकालय से कोड को लोड करने .. हममम की आवश्यकता होगी

0

हाँ, मैं उस बार में भाग गया। यहाँ मैं क्या किया के एक संस्करण है:

YAML & BigDecimal workaround

+0

दुर्भाग्यवश यह समाधान अब काम नहीं करता है। मैं रूबी 1.9.3 पर हूँ –

0

यहाँ डेविड का जवाब है, this related question को 1.9.3 धन्यवाद में काम करने के लिए अद्यतन किया गया है:

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 
संबंधित मुद्दे