NoMethodError:nil的未定义方法`to_d':NilClass

时间:2013-09-20 01:02:41

标签: ruby-on-rails ruby type-conversion

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并且无论如何都要为它指定一个值......所以...评论什么是最好的方法使这一致?我应该认为这是一个错误吗?

4 个答案:

答案 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)