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

uui*_*id0 3 erlang specifications

有没有办法在Erlang中的"-spec"中"继承"规范?

让我举个例子:

我正在写一个典型的便利功能,如:

start_link(Opts) -> gen_server:start_link(?MODULE, [Opts], []).
Run Code Online (Sandbox Code Playgroud)

我想写-spec像:

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

gen_server:start_link/3的结果是

Result = {ok,Pid} | ignore | {error,Error}
Pid = pid()
Error = {already_started,Pid} | term()
Run Code Online (Sandbox Code Playgroud)

我必须复制它或使用模板的start_link函数.我想做的是以某种方式继承gen_server:start_link/3的结果.

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

谢谢大家!

leg*_*cia 9

你可以写一个类型定义,如:

-type start_link_ret() :: {ok,pid()} | ignore | {error,{already_started,pid()} | term()}
Run Code Online (Sandbox Code Playgroud)

(你不能when-type定义中使用,所以它都需要进入相同的表达式.)

然后编写您的规范:

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

如果您打算start_link_ret()在多个模块中使用,可以将其导出:

-export_type([start_link_ret/0]).
Run Code Online (Sandbox Code Playgroud)

然后像foo:start_link_ret()在其他模块中一样使用它.