D语言的模块是基于一个简单的概念的构建块。每个源文件是一个模块。因此,单一的文件,我们一直在编写程序中已经全部单独的模块。 默认情况下,模块的名称与不带.d扩展名文件名相同。当明确指定,该模块的名称是由module关键字,它必须显示为文件。例如在源代码中的第一个非注释行定义,假设一个源文件的名称是“employee.d”时,该模块的名称会由module关键字后跟employee指定。它如下所示。
module employee; class Employee { // Class definition goes here. }
该模块线是可选的。如果未指定,它是相同的文件名不带 .d 扩展名。
文件和模块名
D支持Unicode的源代码和模块名。不过,支持Unicode文件系统的不同而不同。例如,虽然大多数Linux文件系统支持Unicode,在Windows文件系统中的文件名可能不与小写和大写字母区分。此外,大多数文件系统限制,可以在文件和目录名中使用的字符。对于便携性的原因,建议在文件名中只使用小写的ASCII字母。例如,“employee.d”将是一个命名的类eëmployëë一个合适的文件名
因此,模块的名称将包括ASCII字母,以及:
module employee; // Module name consisting of ASCII letters class eëmployëë { }
包
相关的模块组合被称为一个包。 D语言中包是一个简单的概念,同一个目录内的源文件被认为属于同一个包。该目录的名称变成了包,也必须指定为模块名称的第一个部分的名称。
例如,如果“employee.d”和“office.d”里面的目录中“company”,然后连同模块名指定的目录名,使它们成为同一个包的一部分:
module company.employee; class Employee { }
类似地,对于office模块:
module company.office; class Office { }
由于包名对应的目录名,模块,不是一个目录层次更深的包名称必须反映这一层次。例如,如果“company”目录包含一个“branch”目录,该目录内的模块的名称将包括分支
module company.branch.employee;
在程序中使用模块
import关键字,我们一直在使用,几乎每一个程序中,到目前为止,是引入一个模块到当前模块:
import std.stdio;
模块名称可以包含包名称。例如,上面部分表示标准输入输出是一个模块,它是在std包的一部分。
模块的位置
编译器直接转换包和模块名称的目录和文件名查找模块文件。
例如,两个模块员工和办公室将设为“company/employee.d”和“animal/ office.d”,分别为(或“companyemployee.d”和“companyoffice.d”,这取决于文件系统),用于company.employee和company.office。
长和短的模块名称
这是在程序中使用的名称可能拼写,如下图所示的模块和包名。
import company.employee; auto employee0 = Employee(); auto employee1 = company.employee.Employee();
长名称通常是没有必要的,但有时也有名称冲突。举例来说,指的是出现在多于一个模块的名称时,编译器无法决定哪一个意思。下面的程序是拼写出长名称是在两个单独的模块定义了两个独立Employee结构来区分:company和college。
在文件夹company中的第一个employee模块如下所示。
module company.employee; import std.stdio; class Employee { public: string str; void print(){ writeln("Company Employee: ",str); } }
在文件夹college第二个employee模块如下所示。
module college.employee; import std.stdio; class Employee { public: string str; void print(){ writeln("College Employee: ",str); } }
在hello.d的主模块应包含了college和company的文件夹中。如下:
import company.employee; import college.employee; import std.stdio; void main() { auto myemployee1 = new company.employee.Employee(); myemployee1.str = "emp1"; myemployee1.print(); auto myemployee2 = new college.employee.Employee(); myemployee2.str = "emp2"; myemployee2.print(); }
import关键字不足以使模块成为程序的一部分。它只是使提供当前模块内的一个模块的功能。需要这么多只编译代码。
对于上面的程序,将建成“company/employee.d”和“college/employee.d”也必须在编译行中指定。我们将得到下面的输出编译和执行。
$ dmd hello.d company/employee.d college/employee.d -ofhello.amx $ ./hello.amx Company Employee: emp1 College Employee: emp2