D 語言中的模組(Module)

2021-03-31 08:57:02 字數 2978 閱讀 1617

模組:

模組宣告

多個宣告定義

多個宣告定義

多個宣告定義:

宣告定義

宣告定義 多個宣告定義

宣告定義:

特徵指示符

匯入宣告

列舉宣告

類宣告介面宣告

聚集宣告

宣告建構函式

析構函式

不變數單元測試

靜態建構函式

靜態析構函式

除錯規格

版本規格;

module:

moduledeclaration

decldefs

decldefs

decldefs:

decldef

decldef

decldefs

decldef:

attributespecifier

importdeclaration

enumdeclaration

classdeclaration

inte***cedeclaration

aggregatedeclaration

declaration

constructor

destructor

invariant

unittest

staticconstructor

staticdestructor

debugspecification

versionspecification;

模組同原始檔是一一對應的。模組名就是去掉路徑和副檔名的檔名。

模組自動為它的內容提供乙個名字空間。模組有一點像類,不同之處是:

多個模組可以組織成乙個結構,叫做

包 。模組宣告 指定了模組的名稱和它所屬的包。如果不指定,模組名將設定為去掉路徑和副檔名的檔名。

模組宣告:module模組名;模組名:

標誌符

模組名.標誌符

moduledeclaration:modulemodulename;modulename:

identifier

modulename.identifier

最右面的

標誌符 是模組所在的

包 。包在原始檔路徑中對應於目錄名。

如果出現的話,模組宣告 按照語法位於原始檔的開頭,並且每個原始檔只能有乙個。

示例:

module c.stdio;    // 這是c包中的stdio模組
按照慣例,包和模組名都為小寫。這是因為包和模組名稱同作業系統中的目錄名和檔名一一對應,而許多檔案系統不區分大小寫。把所有的包和模組名稱小寫將減少在不同檔案系統之間遷移專案時的問題。與文字的包含檔案不同,d 通過 import 宣告直接匯入符號:
匯入宣告:import模組名列表;模組名列表:

模組名

模組名,模組名列表

importdeclaration:importmodulenamelist;modulenamelist:

modulename

modulename,modulenamelist

最右邊的

標誌符 是模組名稱。模組中的最上層作用域將同當前的作用域合併。

示例:

import std.c.stdio;  // 從c包中匯入stdio模組

import foo, bar; // 匯入foobar模組

每個模組都有自己的命名空間。當乙個模組被匯入另乙個模組時,預設的行為是它的所有最上層宣告都在當前模組中有效。模稜兩可是非法的,可以通過顯式引用解決,方法是通過模組名引用。

例如,假設有下面的模組:

module foo

int x = 1;

int y = 2;

module bar

int y = 3;

int z = 4;

然後:
import foo;

...

q = y; // 設定 q 等於 foo.y

並且:
import foo;

int y = 5;

q = y; // 區域性的 y 覆蓋了 foo.y

以及:
import foo;

import bar;

q = y; // 錯誤:foo.y 還是 bar.y ?

還有:
import foo;

import bar;

q = bar.y; // q 設定為 3

如果匯入是私有的,例如:
module

abc;

private

import

def;

則當其他模組匯入

abc 時不會搜尋

def 。

模組作用域運算子有些時候,有必要重寫通常的詞法作用域規則以訪問被區域性名稱掩蓋的名稱。可以用全域性作用域運算子『.』達到這個目的,全域性運算子位於標誌符之前:

int x;

int foo(int x)

前導的『.』意味著在模組作用域級別查詢名稱。

靜態建構函式是用來在 main() 之前執行的初始化模組或類的**。靜態析構函式是在 main() 返回之後執行的**,通常用來釋放系統資源。靜態初始化的順序隱式地由模組內的

匯入 宣告的順序決定。每個模組都會在它所依賴的模組之後呼叫自己的靜態建構函式。除了這條規則以外,模組靜態建構函式的執行順序是不定的。

匯入宣告中的迴圈(迴圈依賴)是允許的,只要不是兩個模組都含有靜態構造或析構函式就行。如果違反這條規則會在執行時產生異常。

在模組內部,靜態構造會按照它們出現的詞法順序執行。靜態析構將按照與建構函式相反的順序執行。只有當模組的靜態建構函式成功執行後,才會執行靜態析構函式。

D語言中的列舉型別

列舉宣告 enum標誌符 列舉體enum列舉體enum標誌符 列舉基本型別 列舉體enum列舉基本型別 列舉體 列舉基本型別 型別 列舉體 多個列舉成員 列舉成員 列舉成員,列舉成員,多個列舉成員 列舉成員 標誌符 標誌符 表示式enumdeclaration enumidentifier enum...

D語言中的in inout out引數

private import std.stdio,std.process void test inta,inout intb,outint c void main 在上面的例子裡,程式在test函式中的輸出語句將輸出 0 1 0也就是說,out引數取值是無意義的,它只用於賦值。這裡有乙個很大的問題,...

Golang的模組管理Module

golang 1.11版本終於支援了官方的模組依賴管理功能,1.11以前想要實現依賴管理只能夠通過借助第三方庫來實現,1.11以前的版本golang專案必須依賴以gopath,從當前版本開始golang專案可以完全脫離gopath目錄而工作,gopath將會逐漸被移除 go mod的使用也比較簡單,...