Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails NoMethodError:未定义的方法'to#d';零级:零级_Ruby On Rails_Ruby_Type Conversion - Fatal编程技术网

Ruby on rails NoMethodError:未定义的方法'to#d';零级:零级

Ruby on rails NoMethodError:未定义的方法'to#d';零级:零级,ruby-on-rails,ruby,type-conversion,Ruby On Rails,Ruby,Type Conversion,这似乎与其他“待办事项”不一致 例如Rails 3.2.14和ruby 1.9.3p362: NoMethodError: undefined method `to_d' for nil:NilClass 这意味着,当我想要转换为大十进制时,我首先必须确保该值不是零,并为其指定一个0值。。。所以关于使此一致的最佳方法是什么的评论?我应该认为这是一个bug吗?< /P> < P> tod>代码>不是核心Ruby的一部分。它是BigDecimal包的一部分;具体来说,当需要“bigdecima

这似乎与其他“待办事项”不一致

例如Rails 3.2.14和ruby 1.9.3p362:

NoMethodError: undefined method `to_d' for nil:NilClass 

这意味着,当我想要转换为大十进制时,我首先必须确保该值不是零,并为其指定一个0值。。。所以关于使此一致的最佳方法是什么的评论?我应该认为这是一个bug吗?< /P> < P> <代码> tod>代码>不是核心Ruby的一部分。它是BigDecimal包的一部分;具体来说,当
需要“bigdecimal/util”
时,您就可以得到它。它将自己修补到一些核心类中,但正如您所发现的,并不是所有的核心类

如果您只想
nil.to\u d
返回
nil
(这似乎是它返回的唯一明智之举),您可以自己对其进行monkey-patch:

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 
如果你想让它返回一个实际的BigDecimal值为0,那么就返回
BigDecimal.new(0)
,但是我认为
nil
应该是
nil

,你可以总是使用
#try
,如果接收器是
nil
,它将返回
nil
,如果接收器不是nil,则调用该方法

class NilClass
  def to_d
    nil
  end
end

irb(main):015:0> nil.to_d
=> nil
nil.try:to\u d
#=>零
1.试试看
#=> #

如果需要的话,最好先转换成字符串

nil.try :to_d
#=> nil

1.try :to_d
#=> #<BigDecimal:7ffe8e39c1e8,'0.1E1',9(36)>

(nil.try(:to|d)| 0)+value

另外,
nil.to|a
=>[],但是
nil.to|sym
=>未定义方法(natch)。但是,我无法回答您的问题。是的,我知道这是另一个包的一部分。我同意你的看法,它应该做的是不抱怨,不归零。另一个是制造数据,将有意义的“此处无”值改为0。然而,我倾向于希望一致性优于异常,因此可能希望它做其他人正在做的事情。这种行为几乎是故意考虑的:1.93p362:001>1+nI+ 2类型错误:NIL不能强制为FixNu1.1.3p362:002>1 +nI.toyf+2=3.0。在我的思维方式中,我宁愿处理潜在的异常,也不愿对防止它们采取严厉措施。i、 e:总是必须发生的代码,而不是只在需要时发生的代码。@boar:归根结底,这是一种防止输入的情况。如果您有一个nil值,我会尝试使用另一个代码路径,而不是monkey patch或尝试我的方法
BigDecimal.new(amount.to_s)