D语言模块

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

联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2022

备案号:京ICP备15003423号-3