1

コードで変数を返そうとしてTreeいますが、Erlang には戻り変数が明示的に設定されていないようです。次のようにシェルからコードを実行したい:

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)

エラーTreeが に正しく渡されていないことに関連していることに注意してくださいgbtree:add_entry(Key,Val,Tree).。ただし、これを別の方法で行うと、シェルから機能します。関数呼び出しは のgbtree:start().ようなものを返す必要があり{<#.#.#>,{0,nil}}ます。

2> Tree = gb_trees:empty().   
{0,nil}
3>   
3> gbtree:add_entry(1,"something",Tree).
gbt_r lookup 1 "something"
 {1,{1,"something",nil,nil}}

以下はテストコード 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.
4

1 に答える 1

4

関数 start() では、新しいプロセスを生成するときに、モジュール名 ?MODULE、関数名 'init'、およびパラメーター [] を渡します。しかし、それを行うときは、変数 Tree が 2 番目のパラメーター - atom 'init' と等しいことを指定します。

関数 start() からの戻り値は、プロセス ID とアトム「init」のタプルになることを意味します。(init 関数の結果ではありません)。

率直に言って、ここでプロセスを使用する理由がよくわかりません。したがって、このモジュールを次のように作成します。

-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). 
于 2013-03-12T15:53:11.763 に答える