📅  最后修改于: 2020-11-04 05:16:09             🧑  作者: Mango
模块是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”将是名为employee的类的合适文件名。
因此,模块的名称也将由ASCII字母组成-
module employee; // Module name consisting of ASCII letters
class eëmployëë { }
相关模块的组合称为软件包。 D包也是一个简单的概念:位于同一目录内的源文件被视为属于同一包。目录的名称将成为程序包的名称,还必须将其指定为模块名称的第一部分。
例如,如果“ employee.d”和“ office.d”位于目录“ company”内,则指定目录名称以及模块名称会使它们成为同一软件包的一部分-
module company.employee;
class Employee { }
同样,对于办公模块-
module company.office;
class Office { }
由于软件包名称与目录名称相对应,因此深度超过一个目录级别的模块的软件包名称必须反映该层次结构。例如,如果“公司”目录包括“分支”目录,则该目录中的模块名称也将包括分支。
module company.branch.employee;
到目前为止,我们几乎在每个程序中都使用了import关键字,用于将模块引入当前模块-
import std.stdio;
模块名称也可以包含程序包名称。例如,std。上面的part表示stdio是作为std软件包一部分的模块。
编译器通过将软件包和模块名称直接转换为目录和文件名称来查找模块文件。
例如,雇员和办公室这两个模块分别位于“ company / employee.d”和“ animal / office.d”(或“ company \ employee.d”和“ company \ office.d”),具体取决于文件系统),适用于company.employee和company.office。
程序中使用的名称可能会与模块和软件包名称一起拼出,如下所示。
import company.employee;
auto employee0 = Employee();
auto employee1 = company.employee.Employee();
长名称通常是不需要的,但有时会发生名称冲突。例如,当引用出现在多个模块中的名称时,编译器无法确定是哪个名称。下面的程序说明了长名称,以区分在两个单独的模块(公司和大学)中定义的两个单独的员工结构。 。
文件夹公司的第一个员工模块如下。
module company.employee;
import std.stdio;
class Employee {
public:
string str;
void print() {
writeln("Company Employee: ",str);
}
}
文件夹学院中的第二个员工模块如下。
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