Erlang:有没有办法在-spec中“继承”?

时间:2013-05-10 11:03:52

标签: erlang specifications

在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的结果。

有没有办法做到这一点? 有什么想法吗?

谢谢大家!

1 个答案:

答案 0 :(得分: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()