写文章或翻译文章最大的受益是什么 ? 发现新的思路,发现新的解说文字,发现更多的内部机制...
简单教程,这个网站,我酝酿了很久,很久,默默的翻译了很多文章,都没有实际上的上线运行,因为那个时候,我根本就没关心我到底想让它成为什么样的 ?
中途上线了,换了好几个方向,一开始,就如同它的名字一样 「 简单教程,简单编程 」,致力于简化对一个 IT 技术的掌握。
再后来,我发现,写作还是蛮有意思的,就开始淡化这种教程的观念,转而专注于写...
题外话不说了,我们今天本章节要讲解的内容是 Ruby 中的 Numbers 及其相关的类层级结构 ,包含了以下几个知识点
Numeric
的子类Numeric
的祖先链
其实,现代语言 ( 想比较于 C 、C++ 和 Java ) 都在淡化 int
、uint
、long int
等等的差别,转而使用一个统一的 Number
来表示整数。
这样做的好处是什么 ?
不用也不能担心整数应该使用什么类型,应该如何存储,反正只有一种类型。
Numeric 子类
Numeric
类是数字类系列中的最高类。其它相关的数字类都是它的子类,包括 Integer
,Float
,BigDecimal
,Complex
和 Rational
irb> require 'bigdecimal' => true irb> Integer.superclass => Numeric irb> Float.superclass => Numeric irb> BigDecimal.superclass => Numeric irb> Complex.superclass => Numeric irb> Rational.superclass => Numeric
Number
类包含了一组常见的方法:
- 数学运算 ( math )
- 四舍五入运算 ( rounded )
同时也包含了一堆谓词方法,比如 zero?
, negative?
等等
至于那些运算符,则留给了子类自己去定义,比如除法运算符 /
irb> 1.class => Integer irb> Integer.superclass => Numeric irb> Numeric.instance_methods(false).include?(:/) => false irb> Integer.instance_methods(false).include?(:/) => true
上面这个示例中, 1
是单个不可变对象,是 Integer 类的一个实例。
同时,我们也看到,Numeric
类没有定义任何 /
实例方法,这个方法反而在 Integer 子类中定义了。
Numeric 祖先链
因为 Numeric
类是数字类系列中的最高类。所以,也可以说,Numeric 类是一个非常重要的类,因为它是 Ruby 中任何数字类的通用基础
所以,我也就不禁好奇了,那么 Numeric 祖先链到底是啥样的 ?
我们就来探索下吧
irb> Numeric.ancestors => [Numeric, Comparable, Object, Kernel, BasicObject] irb> Numeric.included_modules => [Comparable, Kernel]
从 Numeric.ancestors
中可以看到,Numeric
类继承自默认的 Object 类。
它还包括 Comparable 模块,负责向 Numeric
类添加一堆比较运算符
其实,Numeric
类与 String 类共享完全相同的祖先链。
irb> String.ancestors => [String, Comparable, Object, Kernel, BasicObject] irb> String.included_modules => [Comparable, Kernel]
延伸阅读
- 如果您不熟悉 Object 类和祖先链,可以访问我们的文章 Ruby 中的对象模型 ( object model ) ( 上 )
- 如果您不熟悉 Comparable 模块,可以访问我们的文章 Ruby mixin 编程之 - Comparable ( 可比较的 ) mixin