コードで変数を返そうとして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.