import_type
指令 #此 EEP 提議一個新的 -import_type(Module, [Types])
模組指令來匯入遠端類型。匯入的類型可以像本地類型一樣被引用,無需使用模組前綴。
此提案背後的理由與現有的 -import(Module, [Functions])
指令一致。引入此指令的主要動機如下:
erl_lint
模組定義了一個 本地類型 anno() 來引用類型 erl_anno:anno()
。它使得匯出和匯入類型對稱於匯出和匯入函數。到目前為止,存在不對稱性:類型可以匯出,但不能匯入。
引入新的模組指令
-import_type(Module, [T1/A1, ..., Tk/Ak]).
這裡,Module
是一個原子(匯入類型的模組名稱),Ti
's 是原子(類型名稱),而 Ai
's 是整數(arity)。匯入的類型可以像本地類型一樣被引用 - 無需任何模組前綴。
範例
-module(m1).
-import_type(common_types, [user/0, id/0]).
-spec get_user_id(user()) -> id().
對類型的引用應該明確地解析為本地定義的類型、預定義的內建類型或匯入的類型。這會施加一些限制(類似於匯入函數的限制)
Ti/Ai
只能被匯入一次。這些限制由編譯器驗證(作為 erl_lint
階段的一部分)。工具負責檢查匯入的遠端類型是否存在和是否已匯出,編譯器不檢查它。
限制範例
覆蓋內建類型
-module(m2).
-import_type(m1, [binary/0]).
error: import directive overrides auto-imported builtin type binary/0
匯入兩次
-module(m).
-import_type(m1, [user/0]).
-import_type(m2, [user/0]).
error: type user/0 already imported from m1.
從同一個模組匯入兩次
-module(m).
-import_type(m1, [a/0, b/0]).
-import_type(m1, [b/0, c/0]).
error: type b/0 already imported from m1
重新定義匯入的類型
-module(m).
-import_type(m1, [user/0]).
-type user() :: {user, binary()}.
error: defining imported type user/0
https://github.com/erlang/otp/pull/7618
此實作包含三個邏輯部分
erl_parse
)中的變更以支援新指令。erl_lint
中的變更以強制執行限制(來自詳細資訊章節)此變更是向後相容的。現有程式碼不能有提議的 import_type
屬性,因為目前的編譯器無法解析它們。
本文件置於公共領域或在 CC0-1.0-Universal 許可證下,以較寬鬆者為準。