코드 변경 후 최신 버전의 코드가 사용되도록 모듈에서 로컬 함수를 호출하는 방법을 모르겠습니다.얼랭 코드 변경 및 로컬 함수 호출
예 :
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/1'은 변경되지 않았고 세 번째 변경 후에는 지워졌습니다. 그러나 왜 아직도'? MODULE : loop()'이 새로운 버전의 add/1을로드하고 왜'? MODULE : add()'가'loop/1'을 사용하지 않는지 이해하지 못합니다. . – juro
트릭이'? MODULE : add()'가 완료까지 실행되고 그 모듈이 증발 할 것이라고 생각합니다. 이 모듈에서 수천 개의 프로세스가 실행 중일 수 있으며 변경하고자하는 코드 만 변경할 수는 없다는 것을 잊지 마십시오. – sarnold
코드 대체에 대한 문서는 다음과 같습니다. Erlang - 편집 및 코드로드 http://www.erlang.org/doc/reference_manual/code_loading.html#id83918 – shino