作为一个练习来测试我对顺序 Erlang 的理解,我编写了一个简单的 html 标签编辑器。
它维护文本中的当前位置,例如编辑状态,在这样的记录中:
-record(ed_txt, {a=[], b=[], c=[]).
...其中 a 保存当前段落上方的文本,b 保存当前段落,c 保存当前段落下方的文本。
它是这样调用的:
tag(App, FileName) ->
{ok, File1} = get_file(App, FileName),
{ok, File2} = file_to_paragraphs(File1),
{ok, Record} = create_record(File2),
....
tag(Record) ->
{ok, InputTuple} = get_input(Record), % gets edit command
...
do(Command, Record)
函数 do/2 是递归函数,如下所示:
do("h", Record) -> tag(help(Record));
do("down", Record) -> tag(down(Record));
do("up",Record) -> tag(up(Record));
do("h1", Record) -> tag(wrap("H1", Record));
...
do("quit", Record) -> {ok, quit(Record)};
do(_, Record) -> tag(Record).
现在我想把这个模块变成一个 OTP 生成服务器,但意识到我并不真正了解如何维护状态。
我创建了一个状态记录:
-record(state, {app, filename, a=[], b=[], c=[]}).
我的想法是使用一对一的主管,这样每个用户都在他/她自己的进程中工作,放弃编辑循环,并使用 handle_call(或 handle_cast)来调用各自的编辑函数。
但令我困惑的是:
只要进程在运行,想必用户状态就在进程中保持,但是handle_call和handle_cast都以State为参数,返回State。
这是否意味着我还必须在各自进程之外维护每个用户的状态,也许是在 ets 中?
还是有更好的方法来完全做到这一点?
非常感谢,
LRP