我有幾個問題關於使用gb_tree
結構,例如shell的基本輸入以及在沒有shell輸入的情況下使用beam可執行文件中的樹。Erlang:在beam可執行文件中使用gb_tree函數,記錄操作?
第一個問題是我該如何使用由init()
函數返回的Tree
函數? Tree
在程序的整個生命週期中是否會成爲全球性的?我是否需要將shell中返回的樹例如傳入add_entry()
?
第二個問題涉及到參數傳遞到add_entry
函數調用,如gbt:add_entry(x,"10")
但給了我一個異常錯誤:
** exception error: no function clause matching gbt:add_entry(x,"y") (gbt.erl, line 23)
我使用Tree = gb_trees:enter(value, Data, Tree)
內add_entry()
也試過,但後來我就收到一個錯誤彙編Tree
未被綁定。
我最後的問題是如何將記錄存儲/檢索/刪除/更新到名爲mapping
(在源代碼中聲明)的gb_tree中?
-module(gbt).
-export([init/0,lookup/2,retrieve/2, add_entry/2, delete/2]). % For test purposes only.
-record(mapping, {string="", parameter}).
init() ->
Tree = gb_trees:empty().
lookup(value, Data) ->
case
gb_trees:lookup(value, Data) of
none ->
false ;
_ -> io:format("ok~n")
end.
retrieve(value,Data) ->
case gb_trees:lookup(value, Data) of none ->
false;
{ value, Data} ->
io:format("~w~n", [Data])
end.
add_entry(value, Data) ->
Tree = gb_trees:enter(value, Data, Tree),
io:format("~p ~p ~n", [value,Data]).
delete(value,Data)->
{value, Data} = gb_trees:lookup(value, Data),
Tree = gb_trees:delete(value, Data),
io:format("~w~n", [Data]).
% reserve(Free) ->
% case gb_trees:take_smallest(Free) of
% {Min, Min, Free1} ->
% {Min, Free1};
% {Min, Max, Free1} when Max > Min ->
% {Min, gb_trees:insert(Min+1, Max, Free1)}
% end.
這條線呢?Tree = gb_trees:enter(value,Data,Tree),'?編譯代碼告訴我'gbt.erl:24:變量'樹'沒有綁定 '。看起來好像代碼沒有注意到'Tree = gb_trees:empty()。'聲明瞭'Tree'。我基本上希望代碼在沒有shell IO的情況下運行。基本上根據代碼本身的需要更新'gb_tree',而不需要任何shell輸入。 – pandoragami 2013-03-10 16:37:13
@lost_with_coding,你實際存儲你的樹無處。所有變量都是局部函數。所以,init() - > Tree = gb_trees:empty()。意思是:當你調用init()時,你創建了空樹,然後確保變量Tree與空樹相等,然後忘記變量Tree並返回。 – 2013-03-10 17:58:22
@OdobenusRosmarus有沒有辦法在運行梁EXE的實例中使樹全局化?我是否應該把樹放在一個循環中(),並在模塊中傳遞消息,使用其他函數? – pandoragami 2013-03-10 18:05:44