Numeric

Numeric是数值的抽象类.在Ruby中,使用coerce方法就可以在不同数值类间进行运算.

负责运算和比较的(+, -, *, /, <=>)等方法被定义在子类中. 有时为了提高效率,可以在子类中重新定义那些类似于Numeric方法的方法.

超类:

包含的模块:

方法:

+ self

返回self本身.

- self

反转self的符号后将其返回.

该方法定义如下: 使用双目操作符"-"来计算0 - self.

abs

返回self的绝对值.

ceil

返回一个等于或大于self的最小的整数.

请参考round, truncate, to_i, floor.

clone
dup

返回self.

ruby 1.7 特性: 在version 1.7中,不允许对数值等immutable对象进行clone或dup.

1.dup   # => in `clone': can't clone Fixnum (TypeError)
coerce(number)

number变为可直接与自己进行计算的类型,然后将其存入形如[number, self]的数组并返回它. 数值类的算术操作符在接收到一个无法与自己进行计算的类之后,会调用coerce方法对其进行转换,然后再进行计算.

div(other)

ruby 1.7 特性

返回self除以other的整数商.

p 3.div(2) # => 1
divmod(other)

以数组[q, m]的形式返回self除以other所得的商(q)和余数(m).

此处的x,y,qm的关系如下

x = y * q + m  且  |m| < |y|

整数 q 和 数字 m 满足上述条件.

此外, 在divmod中,余数的符号与other相同(或为0).也就是说

  • other > 0 时 0 <= m < other
  • other < 0 时 other < m <= 0

该方法由/%方法共同定义完成.

floor

返回一个不超过self的最大的整数.

请参考round, truncate, to_i,ceil.

integer?

self为整数则返回真.

modulo(other)

返回self除以other后的余数m(参考divmod).

m的符号与other相同(或为0).也就是说

  • other > 0 时 0 <= m < other
  • other < 0 时 other < m <= 0

该方法被定义为%方法的方法调用.(也就是说与%相同)

nonzero?

0则返回nil,非0则返回self.

quo(other)

ruby 1.8 特性

除法运算,它会尽量返回一个接近实数商(quotient)的值.

p 1.quo(3)      # => 0.3333333333333333

require 'rational'
p 1.quo(3)      # => Rational(1, 3)
remainder(other)

返回self除以other后的余数r(请参考divmod).

但是r的符号与self相同(或为0).即

  • self > 0 时 0 <= r < |other|
  • self < 0 时 -|other| < r <= 0
p (13.modulo(4))      #=>  1
p (13.modulo(-4))     #=> -3
p ((-13).modulo(4))   #=>  3
p ((-13).modulo(-4))  #=> -1

p (13.remainder(4))      #=>  1
p (13.remainder(-4))     #=>  1
p ((-13).remainder(4))   #=> -1
p ((-13).remainder(-4))  #=> -1

该方法是由%方法所定义的.

round

返回最接近self的整数.

请参考truncate, to_i, ceil, floor.

to_int ((<ruby 1.7 特性>))

与self.to_i 相同.

truncate

舍弃小数点后面的部分.

请参考round, to_i, ceil, floor.

zero?

若为0则返回真.

step(limit) {|n| ... } ((<ruby 1.7 特性>))
step(limit, step) {|n| ... } ((<ruby 1.7 特性>))

循环执行块的内容,循环起点是self,步长为step,终点是limit. 同时,step也可以是负数(缺省设置为1).另外,limitstep还可以是Float等.

若将step设为0会引发ArgumentError异常.

返回self.

ruby 1.7 特性: 它脱离了Fixnum, Integer.因此,step也可以是Float.

1.1.step(1.5, 0.1) {|n| p n}
=> 1.1
   1.2
   1.3
   1.4
   1.5

数值相关类中定义的方法

大多数与数值有关的方法都会在子类中得到重新定义. 这一方面是为了提高效率,另一方面是因为在上级抽象类中无法定义具体细节所致. 请参考下表来了解一下到底各个类中有些什么方法.

cary = [Numeric, Integer, Fixnum, Bignum, Float]
mary = cary.collect {|c| c.instance_methods(false)}
methods = mary.flatten.uniq.sort

methods.each_with_index {|op, i|
  if i % 10 == 0
    heading = sprintf("%12s   %10s %10s %10s %10s %10s",
                "", *cary.collect {|klass| klass.name.center(10)})
    puts heading
    puts "-" * heading.size
  end

  printf("%12s | %10s %10s %10s %10s %10s\n",
    op, *mary.collect {|ms| (ms.member?(op) ? "o" : "-").center(10)})
}
=> ruby 1.6.8 (2002-12-24) [i586-linux]
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
              % |     -          -          o          o          o
              & |     -          -          o          o          -
              * |     -          -          o          o          o
             ** |     -          -          o          o          o
              + |     -          -          o          o          o
             +@ |     o          -          -          -          -
              - |     -          -          o          o          o
             -@ |     o          -          o          o          o
              / |     -          -          o          o          o
              < |     -          -          o          -          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
             << |     -          -          o          o          -
             <= |     -          -          o          -          o
            <=> |     o          -          o          o          o
             == |     -          -          o          o          o
            === |     o          -          -          o          -
              > |     -          -          o          -          o
             >= |     -          -          o          -          o
             >> |     -          -          o          o          -
             [] |     -          -          o          o          -
              ^ |     -          -          o          o          -
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
            abs |     o          -          o          o          o
           ceil |     o          o          -          -          o
            chr |     -          o          -          -          -
          clone |     o          -          -          -          -
         coerce |     o          -          -          o          o
            div |     -          -          -          o          -
         divmod |     o          -          o          o          o
         downto |     -          o          o          -          -
           eql? |     o          -          -          o          o
        finite? |     -          -          -          -          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
          floor |     o          o          -          -          o
           hash |     -          -          -          o          o
        id2name |     -          -          o          -          -
      infinite? |     -          -          -          -          o
       integer? |     o          o          -          -          -
         modulo |     o          -          o          o          o
           nan? |     -          -          -          -          o
           next |     -          o          o          -          -
       nonzero? |     o          -          -          -          -
      remainder |     o          -          -          o          -
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
          round |     o          o          -          -          o
           size |     -          -          o          o          -
           step |     -          o          o          -          -
           succ |     -          o          o          -          -
          times |     -          o          o          -          -
           to_f |     -          -          o          o          o
           to_i |     -          o          -          -          o
         to_int |     -          o          -          -          -
           to_s |     -          -          o          o          o
       truncate |     o          o          -          -          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
           type |     -          -          o          -          -
           upto |     -          o          o          -          -
          zero? |     o          -          o          o          o
              | |     -          -          o          o          -
              ~ |     -          -          o          o          -
=> ruby 1.8.0 (2003-08-04) [i586-linux]
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
              % |     -          -          o          o          o
              & |     -          -          o          o          -
              * |     -          -          o          o          o
             ** |     -          -          o          o          o
              + |     -          -          o          o          o
             +@ |     o          -          -          -          -
              - |     -          -          o          o          o
             -@ |     o          -          o          o          o
              / |     -          -          o          o          o
              < |     -          -          o          -          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
             << |     -          -          o          o          -
             <= |     -          -          o          -          o
            <=> |     o          -          o          o          o
             == |     -          -          o          o          o
              > |     -          -          o          -          o
             >= |     -          -          o          -          o
             >> |     -          -          o          o          -
             [] |     -          -          o          o          -
              ^ |     -          -          o          o          -
            abs |     o          -          o          o          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
           ceil |     o          o          -          -          o
            chr |     -          o          -          -          -
         coerce |     o          -          -          o          o
            div |     o          -          o          o          -
         divmod |     o          -          o          o          o
         downto |     -          o          -          -          -
           eql? |     o          -          -          o          o
        finite? |     -          -          -          -          o
          floor |     o          o          -          -          o
           hash |     -          -          -          o          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
        id2name |     -          -          o          -          -
      infinite? |     -          -          -          -          o
       integer? |     o          o          -          -          -
         modulo |     o          -          o          o          o
           nan? |     -          -          -          -          o
           next |     -          o          -          -          -
       nonzero? |     o          -          -          -          -
            quo |     o          -          o          o          -
      remainder |     o          -          -          o          -
          round |     o          o          -          -          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
           size |     -          -          o          o          -
           step |     o          -          -          -          -
           succ |     -          o          -          -          -
          times |     -          o          -          -          -
           to_f |     -          -          o          o          o
           to_i |     -          o          -          -          o
         to_int |     o          o          -          -          o
           to_s |     -          -          o          o          o
         to_sym |     -          -          o          -          -
       truncate |     o          o          -          -          o
                   Numeric    Integer     Fixnum     Bignum     Float
   ---------------------------------------------------------------------
           upto |     -          o          -          -          -
          zero? |     o          -          o          -          o
              | |     -          -          o          o          -
              ~ |     -          -          o          o          -