【问题标题】:Erlang: Returning a variable (gb_trees) from a function call?Erlang:从函数调用中返回一个变量(gb_trees)?
【发布时间】:2013-02-28 05:17:32
【问题描述】:

我试图在代码中返回变量Tree,但似乎 Erlang 没有明确设置返回变量。我想像这样从 shell 运行代码:

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). 有关。但是,以不同的方式执行此操作确实可以在 shell 中使用。函数调用 gbtree:start(). 应该返回类似 {&lt;#.#.#&gt;,{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.

【问题讨论】:

    标签: tree erlang return return-value


    【解决方案1】:

    在函数 start() 中,当您生成新进程时,您传递模块名称 ?MODULE、函数名称“init”和参数 []。但是当你这样做时,你指定变量 Tree 等于第二个参数 - atom 'init'。

    这意味着函数 start() 的返回值将是带有进程 id 和 atom 'init' 的元组。 (不是 init 函数的结果)。

    坦率地说,我不太明白你为什么在这里使用流程,所以,我会这样制作这个模块:

    -module(gbtree).
    -export([init/0, add_entry/3]).
    
    init() -> gb_trees:empty().
    
    add_entry(Key, Data, Tree1) ->
        Tree2 = gb_trees:enter( Key, Data, Tree1),
        io:format("gbt_r lookup ~p ~p~n ",[Key, Data]),
        Tree2.
    

    并使用它:

    T = gbtree:init(),
    
    T1 = gbtree:add_entry(2,this_is_data,T). 
    

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 2016-08-15
      • 2010-12-24
      • 2016-03-04
      • 2019-03-09
      • 2014-04-27
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多