gpt4 book ai didi

Erlang code_change 和本地函数调用

转载 作者:行者123 更新时间:2023-12-04 03:06:36 24 4
gpt4 key购买 nike

我不确定如何调用模块中的本地 函数,以便在代码更改后使用最新版本的代码。请参阅以下示例:

1  -module(test).
2
3 -export([start/0, call/1]).
4 -export([loop/0, add/1]).
5
6 start() ->
7 register(foo, spawn(test, loop, [])).
8
9 call(X) ->
10 foo ! {self(), X},
11 receive
12 Y -> Y
13 end.
14
15 loop() ->
16 receive
17 {Pid, Z} -> Pid ! add(Z)
18 end,
19 loop().
20
21 add(N) ->
22 N + 1.

将要改变的函数是add/1。为了使用最新版本的函数,add/1(第 17 行)的调用应该是完全限定的函数调用{Pid, Z} -> Pid ! ?MODULE:add(Z)。当我尝试时,我得到了这个:

1> c(test). 
{ok,test}
2> test:start().
true
3> test:call(1).
2

第 22 行更改为 N + 2

4> c(test).     
{ok,test}
5> test:call(1).
3

第 22 行再次更改为 N + 3

6> c(test).     
{ok,test}
7> test:call(1).
** exception error: bad argument
in function test:call/1 (test.erl, line 10)

为什么会出现此错误?

最佳答案

我认为您最终需要调用完全限定版本的 loop/0 函数而不是 add/1 函数才能加载和使用新的模块。代码加载机制已准备好同时处理一个模块的两个运行版本,您使用 N+3 的示例是模块的第三个​​加载 - 也是第一个版本被强行删除。

试试这个循环:

15 loop() ->
16 receive
17 {Pid, Z} -> Pid ! add(Z)
18 end,
19 ?MODULE:loop().

我已将其更改为在下次执行 loop/0 时重新加载最新版本。

我相信更常见的是使用 reload 消息或类似的消息来直接显式调用主循环,以避免在每次请求时不断重新加载模块的开销。

关于Erlang code_change 和本地函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11042151/

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