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