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 回答