位置:首頁 > 高級語言 > D語言教學 > D語言模塊

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