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的结果.
有没有办法做到这一点?有什么想法吗?
谢谢大家!
你可以写一个类型定义,如:
-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()在其他模块中一样使用它.