我有一个类,我使用Fixnum
默认值。我想设置一个警卫来确保该类永远不会使用NaN
参数进行实例化。我惊愕地发现Fixnum
不支持nan?
。我有一个解决方法。我只是想知道为什么。
class Table
attr_reader :rows, :min, :max, :increment
def initialize min = 0, max = 100, increment = 20
min = 0 if min.respond_to?(:nan?) && min.nan?
max = 100 if max.respond_to?(:nam?) && max.nan?
@min, @max, @increment, @rows = min.floor, max.ceil, increment, []
end
end
要清楚,这就是我所说的行为:
[8] pry(main)> 0.0.nan?
=> false
[9] pry(main)> BigDecimal.new(0).nan?
=> false
[10] pry(main)> 0.nan?
NoMethodError: undefined method `nan?' for 0:Fixnum
from (pry):10:in `__pry__'
例如,除以零后的行为。
[1] pry(main)> 0/0
ZeroDivisionError: divided by 0
from (pry):1:in `/'
[2] pry(main)> 0.0/0.0
=> NaN
[3] pry(main)> BigDecimal.new(0) / BigDecimal.new(0)
=> #<BigDecimal:1029faf80,'NaN',9(36)>
[4] pry(main)>
答案 0 :(得分:4)
可能是因为整数是有限数或有限数,而NaN不适用于它。
来自Wikipedia:
在计算中,NaN(不是数字)是数字数据类型 值表示未定义或不可表示的值,尤其是 在浮点计算中。引入了NaNs的系统用途 1985年的IEEE 754浮点标准,以及 其他非有限量的表示,如无穷大。
进一步检查:
0.0.class
# => Float
0.class
# => Fixnum
0.class.superclass
# => Integer