3

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 の結果を継承することです。

これを行う方法はありますか?これについて何か考えはありますか?

みんなありがとう!

4

1 に答える 1

9

次のような型定義を記述できます。

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

(定義では使用できないためwhen-typeすべて同じ式に入る必要があります。)

そして、次のように仕様を記述します。

-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()他のモジュールと同じように使用します。

于 2013-05-10T11:13:43.970 に答える