Tree Erlang:从函数调用返回变量(gb_树)?

Tree Erlang:从函数调用返回变量(gb_树)?,tree,erlang,return,return-value,Tree,Erlang,Return,Return Value,我试图在代码中返回变量树,但似乎Erlang没有显式设置返回变量。我想从shell中运行代码,如下所示: 3> {Pid,Tree} = gbtree:start(). {<0.41.0>,init} 4> 4> gbtree:add_entry(2,Pid,Tree). ** exception error: no function clause matching gb_trees:is_defined(2,init)

我试图在代码中返回变量
,但似乎Erlang没有显式设置返回变量。我想从shell中运行代码,如下所示:

3> {Pid,Tree} = gbtree:start().
{<0.41.0>,init}
4> 
4> gbtree:add_entry(2,Pid,Tree). 
** exception error: no function clause matching 
                    gb_trees:is_defined(2,init) (gb_trees.erl, line 221)
     in function  gb_trees:enter/3 (gb_trees.erl, line 335)
     in call from gbtree:add_entry/3 (gbtree.erl, line 13)
以下是测试代码gbtree.erl

-module(gbtree).
-export([start/0, init/0, add_entry/3]).

start() ->  
    register(?MODULE, Pid = spawn(?MODULE, Tree = init, [])),
        { Pid, Tree}.

init() ->   
    Tree = gb_trees:empty(),
    Tree.

add_entry(Key, Data, Tree1) ->
    Tree2 = gb_trees:enter( Key, Data, Tree1),
    io:format("gbt_r lookup ~p ~p~n ",[Key, Data]),
    Tree2.
在函数start()中,生成新进程时,传递模块名?模块、函数名'init'和参数[]。但当您这样做时,您指定变量树等于第二个参数-atom'init'

这意味着函数start()的返回值将是进程id和原子“init”的元组。(不是init函数的结果)

franlky说,我不太明白您为什么在这里使用流程,因此,我将以如下方式创建此模块:

-module(gbtree).
-export([init/0, add_entry/3]).

init() -> gb_trees:empty().

add_entry(Key, Data, Tree1) ->
    Tree2 = gb_trees:enter( Key, Data, Tree1),
    io:format("gbt_r lookup ~p ~p~n ",[Key, Data]),
    Tree2.
并使用它:

T = gbtree:init(),

T1 = gbtree:add_entry(2,this_is_data,T). 
在函数start()中,生成新进程时,传递模块名?模块、函数名'init'和参数[]。但当您这样做时,您指定变量树等于第二个参数-atom'init'

这意味着函数start()的返回值将是进程id和原子“init”的元组。(不是init函数的结果)

franlky说,我不太明白您为什么在这里使用流程,因此,我将以如下方式创建此模块:

-module(gbtree).
-export([init/0, add_entry/3]).

init() -> gb_trees:empty().

add_entry(Key, Data, Tree1) ->
    Tree2 = gb_trees:enter( Key, Data, Tree1),
    io:format("gbt_r lookup ~p ~p~n ",[Key, Data]),
    Tree2.
并使用它:

T = gbtree:init(),

T1 = gbtree:add_entry(2,this_is_data,T).