我是Erlang的新手。我有一个Map,必须使用它创建所有键的注册过程,然后进行进一步处理。我正在partone模块中注册进程:
-module(partone).
-import(parttwo,[start/2]).
start() ->
{ok,List}=file:consult("file.txt"),
MyMap=maps:from_list(List),
maps:fold(
fun(Key,Value,ok) ->
print_Map([Key],[Value])
end,ok,MyMap),
maps:fold(
fun(K,V,ok) ->
register(K,spawn(calling, startFun,[K,V]))
end,ok,MyMap).
print_Map(Key,Value)->
io:fwrite("~n~w : ~w",[Key,Value]).
parttwo.erl:
-module(parttwo).
-export([startFun/2]).
-import(partone,[startFun/0]).
startFun(Key,Value) ->
io:fwrite("~w~n KEY::",[Key]).
我可以通过print_Map在输出中获取地图内容。 但是然后我得到以下错误: {“初始化在do_boot中终止”,{function_clause,[{exchange,'-start / 0-fun-1-',[jill,[bob,joe,bob],true],[{file,“ d:/ exchange .erl“},{line,40}]},{lists,foldl,3,[{file,” lists.erl“},{line,1263}]},{init,start_em,1,[{file, “ init.erl”},{line,1085}]},{init,do_boot,3,[{file,“ init.erl”},{line,793}]}}}}} init终止于do_boot({function_clause,[{exchange,-start / 0-fun-1-,[jill,[],true],[{},{}]}, {lists,foldl,3,[{},{_}]},{init,start_em,1,[{},{}]},{init,do_boot,3 ,[{},{}]}}}})
崩溃转储正在写入:erl_crash.dump ...完成
答案 0 :(得分:1)
您遇到的问题是由于使用ok
作为maps:fold()
的第三个参数引起的。
在您第一次致电maps:fold()
时,由于io:fwrite()
返回ok
,因此每次调用都会返回ok
,这意味着erlang进行了通话:>
Fold_Fun(hello, 10, ok)
与您的fun子句匹配的
|
V
Fold_Fun = fun(Key,Value,ok) -> ...
但是,在您的第二次maps:fold()
调用中,由于register()
返回一个pid,因此您的乐趣每次调用都会返回一个pid,这意味着erlang进行了调用:
Fold_Fun(hello, 10, SomePid)
与fun子句不匹配的
a pid
|
V
Fold_Fun = fun(Key,Value,ok)
如果您想忽略maps:fold()
的第三个参数,则可以指定无关紧要变量,例如_Acc
。在erlang中,变量将匹配任何内容,而原子ok
将仅匹配ok
。
====
spawn(calling, startFun,[K,V])
您尚未发布有关“呼叫”模块的任何内容。
-module(my).
-compile(export_all).
start() ->
{ok, Tuples} = file:consult("data.txt"),
MyMap = maps:from_list(Tuples),
io:format("~p~n", [MyMap]),
Keys = maps:keys(MyMap),
lists:foreach(
fun(Key) ->
#{Key := Val} = MyMap,
register(Key, spawn(my, show, [Key, Val]))
end,
Keys
).
show(Key, Val) ->
io:format("~w : ~w~n", [Key, Val]).
data.txt:
~/erlang_programs$ cat data.txt
{hello, 10}.
{world, 20}.
在外壳中:
9> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}
10> my:start().
#{hello => 10,world => 20}
hello : 10
world : 20
ok