D 程式設計 - 模組



模組是 D 的構建塊。它們基於一個簡單的概念。每個原始檔都是一個模組。因此,我們編寫程式的單個檔案是獨立的模組。預設情況下,模組的名稱與其檔名相同,但不包括 .d 副檔名。

當顯式指定時,模組的名稱由 module 關鍵字定義,該關鍵字必須作為原始檔中的第一行非註釋行出現。例如,假設原始檔名為“employee.d”。那麼模組的名稱由module關鍵字後跟employee指定。如下所示。

module employee;

class Employee {
   // Class definition goes here. 
}

module 行是可選的。當未指定時,它與檔名相同,但不包括 .d 副檔名。

檔案和模組名稱

D 在原始碼和模組名稱中支援 Unicode。但是,檔案系統的 Unicode 支援各不相同。例如,儘管大多數 Linux 檔案系統支援 Unicode,但 Windows 檔案系統中的檔名可能無法區分大小寫字母。此外,大多數檔案系統限制了可以在檔案和目錄名稱中使用的字元。出於可移植性原因,我建議您在檔名中僅使用小寫 ASCII 字母。例如,“employee.d”將是名為 employee 的類的合適檔名。

因此,模組的名稱也將由 ASCII 字母組成 -

module employee;  // Module name consisting of ASCII letters 

class eëmployëë { }

D 包

一系列相關的模組稱為包。D 包也是一個簡單的概念:位於同一目錄中的原始檔被認為屬於同一包。目錄的名稱成為包的名稱,也必須指定為模組名稱的第一部分。

例如,如果“employee.d”和“office.d”位於“company”目錄中,則指定目錄名稱以及模組名稱將使它們成為同一包的一部分 -

module company.employee; 
 
class Employee { }

同樣,對於 office 模組 -

module company.office; 
 
class Office { }

由於包名稱對應於目錄名稱,因此深度超過一級目錄的模組的包名稱必須反映這種層次結構。例如,如果“company”目錄包含一個“branch”目錄,則該目錄中模組的名稱也將包含 branch。

module company.branch.employee;

在程式中使用模組

我們到目前為止幾乎在每個程式中都使用過的 import 關鍵字用於將模組引入當前模組 -

import std.stdio;

模組名稱也可以包含包名稱。例如,上面的 std. 部分表示 stdio 是 std 包的一部分的模組。

模組的位置

編譯器透過將包和模組名稱直接轉換為目錄和檔名來查詢模組檔案。

例如,對於 company.employee 和 company.office,兩個模組 employee 和 office 將分別位於“company/employee.d”和“animal/office.d”(或“company\employee.d”和“company\office.d”,具體取決於檔案系統)。

長模組名和短模組名

程式中使用的名稱可以像下面這樣用模組和包名稱拼寫出來。

import company.employee; 
auto employee0 = Employee(); 
auto employee1 = company.employee.Employee();

通常不需要長名稱,但有時會出現名稱衝突。例如,當引用出現在多個模組中的名稱時,編譯器無法確定哪個名稱是目標。以下程式正在拼寫長名稱以區分在兩個單獨的模組:companycollege 中定義的兩個單獨的employee 結構體。

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
廣告