Rust 中的標稱類型

https://experimentalworks.net/posts/2024-01-22-simple-phantom-types/

Rust 語言中的名義型別
利用名義型別在效率和優雅的方式下編碼類型之間的語義差異的快速概述。
問題
若我們在寫一個程式時,需要各種類型的 ID:使用者 ID、群組 ID 和文件 ID。這些可以表示為 64 位元整數,但在語義上有所不同。使用者 ID 不應與群組 ID 或文件 ID 互換。常見方法是透過命名慣例來區分,但這會容易出錯。然而,Rust 的強大型別系統可以在編譯時防止這些錯誤。

潛在解決方案
一種方法是為每個 ID 創建獨立的型別,但這可以導致程式碼膨脹。更優雅的解決方案是利用具有標記的泛型型別(名義型別)來區分這些型別。這樣的方法雖然稍微冗長,但具有明確的優勢。

幽靈
此方法的核心在於使用 std::marker::PhantomData 標記泛型結構,以在編譯時創建獨特、型別安全的識別碼。雖然此方法在初期可能較為冗長,但提供顯著的優勢。儘管使用幽靈型別可能更複雜,但能夠以較大的價值回報強大的型別安全。

一般化
這種方法非常靈活,適用於任何型別,如 String、Uuid 等。通過創建名義型別,如 type Username = Input和 type Password = Input,可以在程式碼中清楚地強制執行分離。

結論
Rust 的型別系統強大,我們可以在型別級別上強制語義正確性。PhantomData 是 Rust 工具箱中的一個巧妙技巧,允許我們在程式碼中創建豐富的名義型別。它們是撰寫更堅固和抗錯性的程式碼的有效策略。

via Lobsters

January 23, 2024 at 07:25PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *