Numeric は数値の抽象クラスです。Ruby では coerce
メソッドを使うことによって異なる数値クラス間で演算を行うことができます。
演算や比較を行うメソッド(+, -, *, /, <=>)などはサブクラスで定義されま
す。また、効率のため Numeric のメソッドと同じメソッドがサブクラ
スで再定義されている場合があります。
+ selfself 自身を返します。
- selfself の符号を反転させたものを返します。
self / other ((<ruby 1.7 feature>))self を other で割った商を返します。
absself の絶対値を返します。
ceilself と等しいかより大きい最小の整数(天井)を返します。
clonedupself を返します。
ruby 1.7 feature: version 1.7 では数値などの immutable なオ ブジェクトは close や dup が禁止されています。
1.dup # => in `clone': can't clone Fixnum (TypeError)
coerce(number)number の型を自分と直接演算できる型に変換して
[number, self] という配列に格納して返します。数値クラ
スの算術演算子は通常自分と演算できないクラスをオペランドとして受け
取ると coerce を使って自分とオペランドを変換した上で演算を行
います。
divmod(other)self を other で割った商 (q) と余り (m) を、
[q, m] という 2 要素の配列にして返します。
ここで、x を y で割った商 q と余り m とい うのは、それぞれ
x = y * q + m かつ |m| < |y|
をみたす 整数 q と 数 m のことです。
ただし divmod では、上の条件に加えて、余りの符号を
other と同じ(またはゼロ)にします。つまり
となります。
floorself を超えない最大の整数(床)を返します。
integer?self が整数の時、真を返します。
modulo(other)self を other で割った余り m を返します(divmod 参照)。
ただし m の符号は other と同じ(またはゼロ)です。 つまり
となります。
nonzero?ゼロの時、偽を返し、非ゼロの時 self を返します。
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
roundself に最も近い整数を返します。
truncate小数点以下を切捨てます。
zero?ゼロの時、真を返します。
ほとんどの数値関連のメソッドはサブクラスで再定義されています。これは、 効率のためであったり上位抽象クラスで実装を定義することができなかったり するためです。実際にどのメソッドがどのクラスに定義されているかは以下の 表を参照してください。
cary = [Numeric, Integer, Fixnum, Bignum, Float]
mary = cary.collect {|c| c.instance_methods}
methods = []
mary.each {|m| methods |= m}
methods.sort.each_with_index {|op, i|
if i % 10 == 0
heading = sprintf("%10s %10s %10s %10s %10s %10s",
"", *cary.collect {|klass| klass.name.center(10)})
puts heading
puts "-" * heading.size
end
printf("%10s | %10s %10s %10s %10s %10s\n",
op, *mary.collect {|methods| methods.member?(op) ? "o".center(10) : ""})
}
ruby 1.6.6 (2002-01-11) [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
Numeric Integer Fixnum Bignum Float
-------------------------------------------------------------------
abs | o o o o
ceil | o o o
chr | o
clone | o
coerce | o o o
divmod | o o o o
downto | o o
eql? | o o o
finite? | o
floor | o o o
Numeric Integer Fixnum Bignum Float
-------------------------------------------------------------------
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
round | o o o
Numeric Integer Fixnum Bignum Float
-------------------------------------------------------------------
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
type | o
Numeric Integer Fixnum Bignum Float
-------------------------------------------------------------------
upto | o o
zero? | o o o o
| | o o
~ | o o