首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang:从函数调用中返回变量(gb_trees)?

Erlang:从函数调用中返回变量(gb_trees)?
EN

Stack Overflow用户
提问于 2013-03-12 23:38:30
回答 1查看 163关注 0票数 1

我试图在代码中返回变量Tree,但似乎Erlang没有显式设置返回变量。我想从shell运行代码,如下所示:

代码语言:javascript
复制
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)

请注意,该错误与未正确传递到gbtree:add_entry(Key,Val,Tree).Tree有关。但是,在shell中以不同的方式执行此操作。函数调用gbtree:start().应该返回类似于{<#.#.#>,{0,nil}}的内容。

代码语言:javascript
复制
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

代码语言:javascript
复制
-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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-12 23:53:12

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

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

坦率地说,我不太理解你为什么在这里使用process,所以,我会这样做这个模块:

代码语言:javascript
复制
-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.

并使用它:

代码语言:javascript
复制
T = gbtree:init(),

T1 = gbtree:add_entry(2,this_is_data,T). 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15365538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档