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