在Erlang中注册进程并调用模块函数

在Erlang中注册进程并调用模块函数,erlang,erlang-shell,Erlang,Erlang Shell,我是新来的二郎。我有一个映射,我必须用它创建所有密钥的注册进程,然后进行进一步处理。我正在第一部分模块中注册流程: -module(partone). -import(parttwo,[start/2]). start() -> {ok,List}=file:consult("file.txt"), MyMap=maps:from_list(List), maps:fold( fun(Key,Value,ok) ->

我是新来的二郎。我有一个映射,我必须用它创建所有密钥的注册进程,然后进行进一步处理。我正在第一部分模块中注册流程:

-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]).
我可以通过打印地图在输出中获得地图内容。 但是我得到了以下错误: {“init终止于do_boot”,{function_子句,[{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 init em,start,em,1,[{file,init file,init erl.erl},{line,1085},{init line,dou boot,3,{line,},{init line,},},},{line,},{ init终止于do_boot({function_子句,[{exchange,-start/0-fun-1-,[jill,[],true],{},{},{},{}]},{lists,foldl,3,[{},{{},{}]},{init,start_em,1,[{},{},{},},{init do_boot,3,[},{},},}]})


崩溃转储正在写入:erl_Crash.dump…done

您遇到的问题是使用
ok
作为
maps:fold()的第三个参数造成的

在第一次调用
maps:fold()
时,因为
io:fwrite()
返回
ok
,所以每次调用时,您的乐趣都返回
ok
,这意味着erlang进行调用:

Fold_Fun(hello, 10, ok)
Fold_Fun(hello, 10, SomePid)
哪一个符合你的乐趣条款:

                          |
                          V
Fold_Fun = fun(Key,Value,ok) -> ...
                        a pid
                          |
                          V
Fold_Fun = fun(Key,Value,ok)
但是,在第二个
maps:fold()
调用中,因为
register()
返回一个pid,所以每次调用时,您的乐趣都会返回一个pid,这意味着erlang进行调用:

Fold_Fun(hello, 10, ok)
Fold_Fun(hello, 10, SomePid)
与“乐趣”条款不匹配的:

                          |
                          V
Fold_Fun = fun(Key,Value,ok) -> ...
                        a pid
                          |
                          V
Fold_Fun = fun(Key,Value,ok)
如果要忽略
maps:fold()
的第三个参数,则可以指定不关心变量,例如
\u Acc
。在erlang中,变量将匹配任何内容,而atom
ok
将只匹配
ok

====

您还没有发布任何关于“呼叫”模块的信息

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

谢谢你的回答。但是我有一个将映射键和值传递给另一个文件以进行处理的约束。调用模块是parttwo中的“parttwo”。erlI仍然收到这个错误:=错误报告===19-Jun-2018::14:22:29====进程中的错误,退出值:{unde,[{parttwo,show,[bob,[john]]],[]}@NR9,错误消息说没有名为
show()的函数
在名为
第二部分的模块中定义。您可能会混淆模块名称,或者出现拼写错误。我有一个将映射键和值传递到另一个文件进行处理的约束条件——我的示例中的代码
spawn(my,show,[key,Val])
可以更改为
spawn(任何其他模块,show,[key,Val])
,erlang仍将生成一个新进程。