2013-05-10 54 views
3

有沒有辦法在Erlang的-spec中「繼承」規範?Erlang:有沒有辦法在-spec中「繼承」?

讓我舉一個例子:

我正在寫一個典型的便利功能,如:

start_link(Opts) -> gen_server:start_link(?MODULE, [Opts], []). 

我想寫-spec,如:

-spec start_link(Opts) -> Result when 
    Opts :: [Opt], 
    Opts :: {timeout, pos_integer()} 
      | {return_type, ReturnType}, 
    ReturnType :: binary | string, 

的結果gen_server:start_link/3是

Result = {ok,Pid} | ignore | {error,Error} 
Pid = pid() 
Error = {already_started,Pid} | term() 

我必須複製這個或使用模板start_link函數。 我想要做的是以某種方式繼承gen_server:start_link/3的結果。

有沒有辦法做到這一點? 對此有何想法?

謝謝大家!

回答

9

你可以寫一個類型定義,如:(你不能在-type定義使用when,所以這一切需要去到相同的表達)

-type start_link_ret() :: {ok,pid()} | ignore | {error,{already_started,pid()} | term()} 

,然後寫你的SPEC喜歡:

-spec start_link(Opts) -> start_link_ret() when 
    Opts :: [Opt], 
    Opts :: {timeout, pos_integer()} 
      | {return_type, ReturnType}, 
    ReturnType :: binary | string. 

如果你打算在幾個模塊使用start_link_ret(),你可以將其導出:

-export_type([start_link_ret/0]). 

然後在其他模塊中使用它作爲foo:start_link_ret()

+0

它看起來很好。我試圖提供一組「類型模塊」,這些模塊可以作爲項目的依賴項,所以我不必將它們複製到每個項目中。像gen_server_types:start_link_ret()。但是,如果這些外部類型沒有正確納入文檔(原因可能是我)。當點擊edoc生成的html鏈接時,鏈接會導致涅v。然後,我將通過我的項目模板包含這些類型模塊。謝謝! – uuid0 2013-05-22 12:49:14

相關問題