Numeric
は数値の抽象クラスです。Ruby では coerce
メソッドを使うことによって異なる数値クラス間で演算を行うことができます。
演算や比較を行うメソッド(+, -, *, /, <=>)などはサブクラスで定義されま
す。また、効率のため Numeric
のメソッドと同じメソッドがサブクラ
スで再定義されている場合があります。
+ self
self
自身を返します。
- self
self
の符号を反転させたものを返します。
このメソッドは、二項演算子 -
で 0 - self
によって定義
されています。
self == other
self
と other
の値が等しいときに true
、等しくないときに false
を返します。
other
が Numeric
で比較できないオブジェクトの場合、
結合法則が成り立つことを仮定して other == self
の結果を返します。
abs
self
の絶対値を返します。
ceil
self
と等しいかより大きい最小の整数(天井)を返します。
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)
self を other で割った整数の商を返します。
p 3.div(2) # => 1
divmod(other)
self
を other で割った商 (q) と余り (m) を、
[q, m]
という 2 要素の配列にして返します。
ここで、x を y で割った商 q と余り m とい うのは、それぞれ
x = y * q + m かつ |m| < |y|
をみたす 整数 q と 数 m のことです。
ただし divmod
では、上の条件に加えて、余りの符号を
other と同じ(またはゼロ)にします。つまり
となります。
このメソッドは、メソッド /
と %
によって定義されています。
floor
self
を超えない最大の整数(床)を返します。
integer?
self
が整数の時、真を返します。
modulo(other)
self を other で割った余り m を返します(divmod
参照)。
ただし m の符号は other と同じ(またはゼロ)です。 つまり
となります。
このメソッドは、メソッド %
の呼び出しとして定義されています。
(つまり、%
と同じです)
nonzero?
ゼロの時nil
を返し、非ゼロの時 self
を返します。
quo(other)
できるだけ実数の商(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
に最も近い整数を返します。
to_int ((<ruby 1.7 feature>))
self.to_i と同じです。
truncate
小数点以下を切捨てます。
zero?
ゼロの時、真を返します。
step(limit) {|n| ... } ((<ruby 1.7 feature>))
step(limit, step) {|n| ... } ((<ruby 1.7 feature>))
self
からはじめ step を足しながら limit を越える
前までブロックを繰り返します。step は負の数も指定できます(省
略時は 1)。また、limit や step には Float なども
指定できます。
step に 0 を指定した場合は例外 ArgumentError が発生します。
self
を返します。
ruby 1.7 feature: Fixnum, Integer から移動しまし
た。これにより Float も step
できるようになりました。
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 -