
- D 程式設計基礎
- D 程式設計 - 首頁
- D 程式設計 - 概述
- D 程式設計 - 環境
- D 程式設計 - 基本語法
- D 程式設計 - 變數
- D 程式設計 - 資料型別
- D 程式設計 - 列舉
- D 程式設計 - 字面量
- D 程式設計 - 運算子
- D 程式設計 - 迴圈
- D 程式設計 - 條件判斷
- D 程式設計 - 函式
- D 程式設計 - 字元
- D 程式設計 - 字串
- D 程式設計 - 陣列
- D 程式設計 - 關聯陣列
- D 程式設計 - 指標
- D 程式設計 - 元組
- D 程式設計 - 結構體
- D 程式設計 - 聯合體
- D 程式設計 - 範圍
- D 程式設計 - 別名
- D 程式設計 - 混合宏
- D 程式設計 - 模組
- D 程式設計 - 模板
- D 程式設計 - 不可變物件
- D 程式設計 - 檔案 I/O
- D 程式設計 - 併發
- D 程式設計 - 異常處理
- D 程式設計 - 合約
- D - 條件編譯
- D 程式設計 - 面向物件
- D 程式設計 - 類與物件
- D 程式設計 - 繼承
- D 程式設計 - 過載
- D 程式設計 - 封裝
- D 程式設計 - 介面
- D 程式設計 - 抽象類
- D 程式設計 - 有用資源
- D 程式設計 - 快速指南
- D 程式設計 - 有用資源
- D 程式設計 - 討論
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();
通常不需要長名稱,但有時會出現名稱衝突。例如,當引用出現在多個模組中的名稱時,編譯器無法確定哪個名稱是目標。以下程式正在拼寫長名稱以區分在兩個單獨的模組:company 和 college 中定義的兩個單獨的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