在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的结果。
有没有办法做到这一点? 有什么想法吗?
谢谢大家!
答案 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()
。