gpt4 book ai didi

Erlang:扩展的 gen_server

转载 作者:行者123 更新时间:2023-12-03 21:41:32 36 4
gpt4 key购买 nike

我想延长 gen_server (创建一个 gen_server_extra )具有一些附加功能。要求是:

  • gen_server_extra进程的行为应该像常规的 gen_server的。例如,他们应该通过 gen_server:call 接听电话,与SASL集成,拟合OTC监督树等
  • gen_server_extra进程应该有一个额外的功能,由 gen_server_extra 提供.这基本上意味着一些消息将由 gen_server_extra 处理。代码,而不将它们传递给回调模块。其余消息按原样传递给回调模块。
  • gen_server_extra功能需要它自己的状态,应该对回调模块隐藏。

  • 最简单的方法是什么?

    最佳答案

    最好的、最模块化的方法是在模块中实现一个新行为(例如 gen_ext_server )并包装 gen_server从那里的行为。

    首先,确保您的行为与 gen_server 相同。 :

    -module(gen_ext_server).
    -behavior(gen_server).

    % Exports...

    behaviour_info(Type) -> gen_server:behaviour_info(Type).

    实现 gen_server 所需的所有回调, 保持在你的状态下实现你的行为的回调模块的名称:
    init([Mod|ExtraArgs]) ->
    % ...
    ModState = Mod:init(ExtraArgs),
    #state{mod = Mod, mod_state = ModState, internal = [...]}

    然后,在每个 gen_server回调,实现您的行为,然后在需要时调用回调模块:
    handle_call(internal, _From, State) ->
    % Do internal stuff...
    {reply, ok, State};
    handle_call(Normal, From, State = #state{mod = Mod, mod_state = ModState}) ->
    case Mod:handle_call(Normal, From, ModState) of
    {reply, Reply, NewState} ->
    {reply, Reply, #state{mod_state = NewState};
    ... ->
    ...
    end.

    handle_cast/2 实现类似的功能, handle_info/2 , terminate/1等等

    关于Erlang:扩展的 gen_server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6745183/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com