Numeric

Numeric は数値の抽象クラスです。Ruby では coerce メソッドを使うことによって異なる数値クラス間で演算を行うことができます。

演算や比較を行うメソッド(+, -, *, /, <=>)などはサブクラスで定義されま す。また、効率のため Numeric のメソッドと同じメソッドがサブクラ スで再定義されている場合があります。

スーパークラス:

インクルードしているモジュール:

メソッド:

+ self

self 自身を返します。

- self

self の符号を反転させたものを返します。

このメソッドは、二項演算子 -0 - self によって定義 されています。

self == other

selfother の値が等しいときに true、等しくないときに false を返します。 otherNumeric で比較できないオブジェクトの場合、 結合法則が成り立つことを仮定して other == self の結果を返します。

abs

self の絶対値を返します。

ceil

self と等しいかより大きい最小の整数(天井)を返します。

round, truncate, to_i, floor も参照。

clone
dup

self を返します。

ruby 1.7 feature: 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 feature

self を other で割った整数の商を返します。

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

selfother で割った商 (q) と余り (m) を、 [q, m] という 2 要素の配列にして返します。

ここで、xy で割った商 q と余り m とい うのは、それぞれ

x = y * q + m  かつ  |m| < |y|

をみたす 整数 q と 数 m のことです。

ただし divmod では、上の条件に加えて、余りの符号を other と同じ(またはゼロ)にします。つまり

  • 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 と同じ(またはゼロ)です。 つまり

  • other > 0 のとき 0 <= m < other
  • other < 0 のとき other < m <= 0

となります。

このメソッドは、メソッド % の呼び出しとして定義されています。 (つまり、% と同じです)

nonzero?

ゼロの時nilを返し、非ゼロの時 self を返します。

quo(other)

ruby 1.8 feature

できるだけ実数の商(quotient)に近い値を返す割算。

p 1.quo(3)      # => 0.3333333333333333

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

self を other で割った余り r を返します (divmod参照)。

ただし r の符号は self と同じ(またはゼロ)です。 つまり

  • 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 feature>))

self.to_i と同じです。

truncate

小数点以下を切捨てます。

round, to_i, ceil, floor も参照。

zero?

ゼロの時、真を返します。

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

self からはじめ step を足しながら limit を越える 前までブロックを繰り返します。step は負の数も指定できます(省 略時は 1)。また、limitstep には Float なども 指定できます。

step に 0 を指定した場合は例外 ArgumentError が発生します。

self を返します。

ruby 1.7 feature: Fixnum, Integer から移動しまし た。これにより Floatstep できるようになりました。

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          -


rubyist ML