Numeric是数值的抽象类.在Ruby中,使用coerce方法就可以在不同数值类间进行运算.
负责运算和比较的(+, -, *, /, <=>)等方法被定义在子类中. 有时为了提高效率,可以在子类中重新定义那些类似于Numeric方法的方法.
+ self返回self本身.
- self反转self的符号后将其返回.
该方法定义如下: 使用双目操作符"-"来计算0 - self.
abs返回self的绝对值.
ceil返回一个等于或大于self的最小的整数.
clonedup返回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,q和m的关系如下
x = y * q + m 且 |m| < |y|
整数 q 和 数字 m 满足上述条件.
此外, 在divmod中,余数的符号与other相同(或为0).也就是说
该方法由/ 和 %方法共同定义完成.
floor返回一个不超过self的最大的整数.
integer?若self为整数则返回真.
modulo(other)返回self除以other后的余数m(参考divmod).
m的符号与other相同(或为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 <= 0p (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 特性>))与self.to_i 相同.
truncate舍弃小数点后面的部分.
zero?若为0则返回真.
step(limit) {|n| ... } ((<ruby 1.7 特性>))step(limit, step) {|n| ... } ((<ruby 1.7 特性>))循环执行块的内容,循环起点是self,步长为step,终点是limit. 同时,step也可以是负数(缺省设置为1).另外,limit和step还可以是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 -