0

gb_treeシェルからの基本的な入力や、シェル入力なしでビーム実行可能ファイル内でツリーを使用するなど、構造の使用に関していくつか質問があります。

最初の質問は、関数Treeによって返されたをどのように使用するかです。プログラムの存続期間中にグローバルになりますかinit()? たとえばTree、シェルから返された Tree を渡す必要がありますか?add_entry()

2番目の質問は、次の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.
4

1 に答える 1

3

Erlang のデータ構造は永続的です。これは、グローバル参照がなく、特定のツリーを常に新しいツリーに更新することを意味します。

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

Erlang は永続的なバージョンを保持しているため、TreeOfSize1がまだ存在し、KV バインディングがないことに注意してください。foo -> bar古いバージョンへの参照を保持すると自動的にそのバージョンに「戻る」ことができるため、これは多くの状況で非常に役立ちます。

あなたのバグに関しては、それはあなたが書いているからであり、そうでは(value, Data)ないからです(Value, Data)。書き込みvalueはバインディングではなくatom()呼び出されるvalueため、渡すxと関数と一致せず、パターン一致 function_clause エラーが発生します。

于 2013-03-10T11:59:07.190 に答える