【问题标题】:what is the type signature of `Func` in gen_server:start/4?gen_server:start/4 中 `Func` 的类型签名是什么?
【发布时间】:2021-11-06 19:18:52
【问题描述】:

OTP 文档说gen_server:start/4 的签名是这样的:

start_link(ServerName, Module, Args, Options) -> Result
ServerName = {local,Name} | {global,GlobalName}
  | {via,Module,ViaName}
 Name = atom()
 GlobalName = ViaName = term()
Module = atom()
Args = term()
Options = [Option]
 Option = {debug,Dbgs} | {timeout,Time} | {hibernate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}
  Dbgs = [Dbg]
   Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}
  SOpts = [term()]
Result = {ok,Pid} | ignore | {error,Error}
 Pid = pid()
 Error = {already_started,Pid} | term()

https://erlang.org/doc/man/gen_server.html#start_link-4

Func 是什么?文档只是说:

当需要比 gen_server 进程行为提供的更复杂的初始化过程时,此函数很有用。

所以现在我知道它很有用。但它需要多少参数?有哪些种类?

感谢您的帮助。

【问题讨论】:

    标签: erlang gen-server


    【解决方案1】:

    该规范中的Funcdebug 的一个选项,因此与该文档几乎没有关系。

    您引用的文档是指gen_server:enter_loop 函数,而不是Func

    关于您的问题,Funcsys 模块处理,就像在sys:install/2 中一样,并且具有以下spec

     dbg_fun() =
        fun((FuncState :: term(),
             Event :: system_event(),
             ProcState :: term()) ->
                done | (NewFuncState :: term()))
    

    【讨论】:

      【解决方案2】:

      如果我在最新的 master 上关注源,gen_server 的文件没有提到 install 作为任何 debug 选项。

      所以我猜

      1. 代码已更改,文档不是最新的
      2. 代码和文档已更改,但未部署最新文档

      从历史上看,它可能就是“@Jose M”所指的。

      【讨论】:

      • gen_server 的文件没有提到install,因为gen_server:enter_loop/4(与所有其他公共 gen_server 函数一样)缺少规范。准规范(使用不同的语法)来自 XML 文档。您可以看出语法不同,因为实际规范在约束中使用 :: 而不是 =
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2017-06-28
      • 2016-03-12
      • 1970-01-01
      • 2014-05-30
      相关资源
      最近更新 更多