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