NoMethodError:nil:NilClass的未定义方法“ to_d”

boa*_*oar 5 ruby ruby-on-rails type-conversion

NoMethodError: undefined method `to_d' for nil:NilClass 
Run Code Online (Sandbox Code Playgroud)

这似乎与其他“ 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 
Run Code Online (Sandbox Code Playgroud)

这意味着无论何时我可能想转换为大十进制数时,我首先都必须确保该值不为nil并为它分配一个0值。 ?我应该认为这是一个错误吗?

Jim*_*art 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
Run Code Online (Sandbox Code Playgroud)

如果您希望它返回值为0的实际BigDecimal,则应返回BigDecimal.new(0),但我认为nil应该是nil