D語言的模塊是基于一個(gè)簡單的概念的構(gòu)建塊。每個(gè)源文件是一個(gè)模塊。因此,單一的文件,我們一直在編寫程序中已經(jīng)全部單獨(dú)的模塊。 默認(rèn)情況下,模塊的名稱與不帶.d擴(kuò)展名文件名相同。當(dāng)明確指定,該模塊的名稱是由module關(guān)鍵字,它必須顯示為文件。例如在源代碼中的第一個(gè)非注釋行定義,假設(shè)一個(gè)源文件的名稱是“employee.d”時(shí),該模塊的名稱會(huì)由module關(guān)鍵字后跟employee指定。它如下所示。
module employee; class Employee { // Class definition goes here. }
該模塊線是可選的。如果未指定,它是相同的文件名不帶 .d 擴(kuò)展名。
D支持Unicode的源代碼和模塊名。不過,支持Unicode文件系統(tǒng)的不同而不同。例如,雖然大多數(shù)Linux文件系統(tǒng)支持Unicode,在Windows文件系統(tǒng)中的文件名可能不與小寫和大寫字母區(qū)分。此外,大多數(shù)文件系統(tǒng)限制,可以在文件和目錄名中使用的字符。對(duì)于便攜性的原因,建議在文件名中只使用小寫的ASCII字母。例如,“employee.d”將是一個(gè)命名的類eëmployëë一個(gè)合適的文件名
因此,模塊的名稱將包括ASCII字母,以及:
module employee; // Module name consisting of ASCII letters class eëmployëë { }
相關(guān)的模塊組合被稱為一個(gè)包。 D語言中包是一個(gè)簡單的概念,同一個(gè)目錄內(nèi)的源文件被認(rèn)為屬于同一個(gè)包。該目錄的名稱變成了包,也必須指定為模塊名稱的第一個(gè)部分的名稱。
例如,如果“employee.d”和“office.d”里面的目錄中“company”,然后連同模塊名指定的目錄名,使它們成為同一個(gè)包的一部分:
module company.employee; class Employee { }
類似地,對(duì)于office模塊:
module company.office; class Office { }
由于包名對(duì)應(yīng)的目錄名,模塊,不是一個(gè)目錄層次更深的包名稱必須反映這一層次。例如,如果“company”目錄包含一個(gè)“branch”目錄,該目錄內(nèi)的模塊的名稱將包括分支
module company.branch.employee;
import關(guān)鍵字,我們一直在使用,幾乎每一個(gè)程序中,到目前為止,是引入一個(gè)模塊到當(dāng)前模塊:
import std.stdio;
模塊名稱可以包含包名稱。例如,上面部分表示標(biāo)準(zhǔn)輸入輸出是一個(gè)模塊,它是在std包的一部分。
編譯器直接轉(zhuǎn)換包和模塊名稱的目錄和文件名查找模塊文件。
例如,兩個(gè)模塊員工和辦公室將設(shè)為“company/employee.d”和“animal/ office.d”,分別為(或“companyemployee.d”和“companyoffice.d”,這取決于文件系統(tǒng)),用于company.employee和company.office。
這是在程序中使用的名稱可能拼寫,如下圖所示的模塊和包名。
import company.employee; auto employee0 = Employee(); auto employee1 = company.employee.Employee();
長名稱通常是沒有必要的,但有時(shí)也有名稱沖突。舉例來說,指的是出現(xiàn)在多于一個(gè)模塊的名稱時(shí),編譯器無法決定哪一個(gè)意思。下面的程序是拼寫出長名稱是在兩個(gè)單獨(dú)的模塊定義了兩個(gè)獨(dú)立Employee結(jié)構(gòu)來區(qū)分:company和college。
在文件夾company中的第一個(gè)employee模塊如下所示。
module company.employee; import std.stdio; class Employee { public: string str; void print(){ writeln("Company Employee: ",str); } }
在文件夾college第二個(gè)employee模塊如下所示。
module college.employee; import std.stdio; class Employee { public: string str; void print(){ writeln("College Employee: ",str); } }
在hello.d的主模塊應(yīng)包含了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關(guān)鍵字不足以使模塊成為程序的一部分。它只是使提供當(dāng)前模塊內(nèi)的一個(gè)模塊的功能。需要這么多只編譯代碼。
對(duì)于上面的程序,將建成“company/employee.d”和“college/employee.d”也必須在編譯行中指定。我們將得到下面的輸出編譯和執(zhí)行。
$ dmd hello.d company/employee.d college/employee.d -ofhello.amx $ ./hello.amx Company Employee: emp1 College Employee: emp2