2013-03-10 31 views
0

我有幾個問題關於使用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. 

回答

3

Erlang的數據結構持續。這意味着沒有全局引用,並且您總是將給定的樹更新爲新的樹。

NewTree = gb_trees:empty(), 
TreeOfSize1 = gb_trees:enter(hello, world, NewTree), 
TreeOfSize2 = gb_tress:enter(foo, bar, TreeOfSize1). 

注意TreeOfSize1仍然存在,它沒有KV結合foo -> bar,因爲二郎神圍繞保持一個持久的版本。這在許多情況下非常有用,因爲保留對舊版本的引用會自動使您能夠「返回」該版本。

至於你的錯誤,這是因爲你正在寫(value, Data)而不是(Value, Data)。寫valueatom()value不是一個綁定,所以當你通過x它不匹配的功能,你會得到一個模式匹配function_clause錯誤。

+0

這條線呢?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

+0

@lost_with_coding,你實際存儲你的樹無處。所有變量都是局部函數。所以,init() - > Tree = gb_trees:empty()。意思是:當你調用init()時,你創建了空樹,然後確保變量Tree與空樹相等,然後忘記變量Tree並返回。 – 2013-03-10 17:58:22

+0

@OdobenusRosmarus有沒有辦法在運行梁EXE的實例中使樹全局化?我是否應該把樹放在一個循環中(),並在模塊中傳遞消息,使用其他函數? – pandoragami 2013-03-10 18:05:44

相關問題