NoMethodError: undefined method `to_d' for nil:NilClass
这似乎与其他“to _”
不一致例如使用Rails 3.2.14和ruby 1.9.3p362:
1.9.3p362 :055 > nil.to_f
=> 0.0
1.9.3p362 :056 > nil.to_d
NoMethodError: undefined method `to_d' for nil:NilClass
1.9.3p362 :057 > nil.to_s
=> ""
1.9.3p362 :058 > nil.to_i
=> 0
这意味着当我想要转换为大小数时,我首先必须确保该值不是nil并且无论如何都要为它指定一个值......所以...评论什么是最好的方法使这一致?我应该认为这是一个错误吗?
答案 0 :(得分:5)
to_d
不是核心Ruby的一部分。它是BigDecimal包的一部分;特别是你在require "bigdecimal/util"
时得到它。它将自己修补成一些核心类,但正如你所发现的那样,不是全部。
如果您只是希望nil.to_d
返回nil
(这似乎是唯一明智的回归),您可以自己进行修补:
class NilClass
def to_d
nil
end
end
irb(main):015:0> nil.to_d
=> nil
如果您希望它返回值为0的实际BigDecimal,则返回BigDecimal.new(0)
,但我认为nil
应为nil
。
答案 1 :(得分:1)
或
(nil.try(:to_d) || 0) + value
答案 2 :(得分:0)
您可以随时使用#try
,如果接收方为nil
则会返回nil
,如果接收方不是零则会调用方法
nil.try :to_d
#=> nil
1.try :to_d
#=> #<BigDecimal:7ffe8e39c1e8,'0.1E1',9(36)>
答案 3 :(得分:0)
如果你需要的话,你可能最好先转换成字符串
BigDecimal.new(amount.to_s)