Ruby 中的 Numbers 及其相关的类层级结构

yufei       6 年, 3 月 前       1119

写文章或翻译文章最大的受益是什么 ? 发现新的思路,发现新的解说文字,发现更多的内部机制...

简单教程,这个网站,我酝酿了很久,很久,默默的翻译了很多文章,都没有实际上的上线运行,因为那个时候,我根本就没关心我到底想让它成为什么样的 ?

中途上线了,换了好几个方向,一开始,就如同它的名字一样 「 简单教程,简单编程 」,致力于简化对一个 IT 技术的掌握。

再后来,我发现,写作还是蛮有意思的,就开始淡化这种教程的观念,转而专注于写...


题外话不说了,我们今天本章节要讲解的内容是 Ruby 中的 Numbers 及其相关的类层级结构 ,包含了以下几个知识点

  • Numeric 的子类
  • Numeric 的祖先链

其实,现代语言 ( 想比较于 CC++Java ) 都在淡化 intuintlong int 等等的差别,转而使用一个统一的 Number 来表示整数。

这样做的好处是什么 ?

不用也不能担心整数应该使用什么类型,应该如何存储,反正只有一种类型。

Numeric 子类

Numeric 类是数字类系列中的最高类。其它相关的数字类都是它的子类,包括 IntegerFloatBigDecimalComplexRational

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 类包含了一组常见的方法:

  1. 数学运算 ( math )
  2. 四舍五入运算 ( 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]

延伸阅读

  1. 如果您不熟悉 Object 类和祖先链,可以访问我们的文章 Ruby 中的对象模型 ( object model ) ( 上 )
  2. 如果您不熟悉 Comparable 模块,可以访问我们的文章 Ruby mixin 编程之 - Comparable ( 可比较的 ) mixin
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.