2012-05-23 38 views
6

Điều này sẽ khá đơn giản, nhưng nó sẽ bị thổi phồng lên. Bất kỳ ý tưởng?BigDecimal không thể bị ép buộc thành 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

Hmmm, trông giống như 'to_yaml' bị nhầm lẫn trên BigDecimal,' BigDecimal.new ("2.0"). to_yaml' nói '" ---! ruby ​​/ object: BigDecimal {} \ n \ n "'. –

+1

Đúng. 'ActiveSupport' có vẻ thêm phần mở rộng cốt lõi cho điều này, nhưng trên nền tảng của tôi, tôi nhận được' BigDecimal.new ("2.0"). To_yaml' -> '" --- 2.0 \ n "'. Vì vậy, mặc dù nó hoạt động tốt hơn, nó vẫn không chuyển đổi thành một 'BigDecimal' đầy đủ: http://apidock.com/rails/BigDecimal/to_yaml – Casper

Trả lời

1

Đây là một lỗi đã được reportedfixed.

Giải pháp tốt nhất sẽ được nâng cấp lên phiên bản Ruby mới nhất (bản sửa lỗi nằm ở mức bản vá 194 trở đi).

Nếu bạn không thể nâng cấp phiên bản Ruby của mình, bạn có thể khắc phục bằng cách cài đặt Psych gem. Nếu bạn làm điều này, bạn sẽ cần phải thêm gem 'psych' trước khi bạn require 'yaml' (hoặc thêm nó vào Gemfile nếu bạn đang sử dụng Bundler) để tải mã từ đá quý thay vì từ thư viện chuẩn ..

0

Vâng, tôi đã gặp phải điều đó một lần. Dưới đây là một phiên bản của những gì tôi đã làm:

YAML & BigDecimal workaround

+0

Thật không may là giải pháp không còn hoạt động nữa. Tôi đang trên ruby ​​1.9.3 –

0

Dưới đây là câu trả lời của David, cập nhật để làm việc trong 1.9.3 nhờ this related question:

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 
Các vấn đề liên quan