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值。 ?我应该认为这是一个错误吗?
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。