0

我对结构的使用有几个问题,gb_tree例如来自 shell 的基本输入以及在没有 shell 输入的梁可执行文件中使用树。

第一个问题是如何使用函数Tree返回的init()?在程序的生命周期内是否Tree变成全局的?我是否需要将返回的树从外壳传递到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)inside ,但后来在未绑定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.
4

1 回答 1

3

Erlang 中的数据结构是持久的。这意味着没有全局引用,并且您总是将给定的树更新为新的。

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

请注意,它TreeOfSize1仍然存在并且它没有 KV 绑定foo -> bar,因为 Erlang 保留了一个持久版本。这在许多情况下非常有用,因为自动保留对旧版本的引用使您能够“返回”到该版本。

至于您的错误,那是因为您正在编写(value, Data)而不是(Value, Data). 写入value是被atom()调用value而不是绑定,因此当您传递x它时,它与函数不匹配,并且您会收到模式匹配 function_clause 错误。

于 2013-03-10T11:59:07.190 回答