阅读(2817) (18)

D编程 模块

2021-09-01 10:27:19 更新

模块是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ëë { }

Packages包

相关模块的组合称为Package包,包也是一个简单的概念:位于同一目录内的源文件被视为属于同一包,目录名将成为软件包的名称,还必须将其指定为模块名称的第一部分。

如果" 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"(或" companyemployee.d"和" companyoffice.d",具体取决于文件系统),适用于company.employee和company.office。

长模块和短模块名

程序中使用的名称可能会与模块和软件包名称一起拼出,如下所示。

import company.employee; 
auto employee0=Employee(); 
auto employee1=company.employee.Employee();

长名称通常是不需要的,但有时会发生名称冲突,如当引用出现在多个模块中的名称时,编译器无法确定是哪个名称。下面的程序将拼写长名称,以区分在两个单独的模块( company 和 college。)中定义的两个单独的 employee 结构。

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