6
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 值......所以......评论什么是使这一点保持一致的最佳方法? 我应该认为这是一个错误吗?

4

4 回答 4

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.

于 2013-09-20T01:28:40.837 回答
2

或者 (nil.try(:to_d) || 0) + value

于 2017-07-06T06:30:02.780 回答
0

您可以随时使用,如果接收者是,#try它将返回,或者如果接收者不为零,则调用该方法nilnil

nil.try :to_d
#=> nil

1.try :to_d
#=> #<BigDecimal:7ffe8e39c1e8,'0.1E1',9(36)>
于 2013-09-20T01:29:14.980 回答
0

如果这是您需要的,您最好先转换为字符串

BigDecimal.new(amount.to_s) 
于 2017-06-06T18:04:21.010 回答