D 入门指南/基础知识/模块简介
(Java 程序员:请阅读本章节的最后一小节)
从技术上讲,模块将逻辑上属于一起的事物分组在一起。一个模块可以包含任意数量的函数、变量和其他 D 结构的定义,这些结构将在后面介绍。这些部分可以通过 D 中的其他模块轻松访问。
每个 D 程序至少包含一个模块,该模块包含main()函数(见 上一节)。
实际上,在 D 中,模块只是一个包含 D 源代码的文件(通常具有“.d”文件后缀)。
在编程中,使代码可重用非常重要。如果没有可重用代码,编写即使是很小的程序的过程也会因重写所有需要的基本代码而变得不堪重负,例如与用户或网络的通信以及数学函数。
与函数类似,模块是将复杂程序分解成可以单独查看的小部分的另一种方法。
在 D 中,要从模块 Y 访问模块 X,必须在模块 Y 中导入模块 X。
导入模块是通过一个import语句来完成的,该语句包含关键字import和模块名称。例如,要导入模块“std.cstream”(将在后面讨论),使用以下语句
import std.cstream;
当然,这可以推广到导入任何模块
import module name;
在导入模块中定义的所有内容(例如函数、变量等)都将为导入模块所知,并且可以在其中使用。
一个包是一组模块,可能还包含(子)包。实际上它只是一个包含模块源文件和其他目录的目录。在上面的例子中,“std”是一个包含模块“cstream”(以及其他模块)的包。导入模块时,必须始终在import语句中提及包含它的包,用点彼此分隔,并与实际模块名称分隔(与文件路径非常相似)。
包通常用于将处理一项或多项常用任务的模块组合在一起。这种类型的包被称为库。大多数库专门用于执行单一任务,但有些库则(更)通用。Phobos 运行时库就是一个著名的例子。它是 D 语言的标准库,所有 D 编译器都将其作为标准库提供std包。它处理语言本身未内置的基本功能,例如输入和输出、常见的数学函数等等。虽然 D 编译器需要包含 Phobos(或一个 100% 兼容的库),但它本身并不是语言的一部分。因此,本书将不会深入介绍 Phobos,除了必要的内容以外。
当然可以编写自己的模块。事实上,你编写的任何 D 程序都将包含在一个模块中。但是,在本指南中,直到介绍了更多基础知识后,才会介绍将程序分成多个模块的方法。
- 模块可以包含零个或多个类定义,也可以包含其他实体,例如函数。
- 模块名称与包含的实体名称之间没有关系。
- 模块名称遵循标识符的一般规则,文件名后缀为“.d”。
- 模块可以像 Java 一样组织到包中(使用目录)。