当前位置:  开发笔记 > 编程语言 > 正文

Erlang中的ETS声明

如何解决《Erlang中的ETS声明》经验,为你挑选了1个好方法。

以下代码给出了一个错误: "语法错误之前:Some_ets"

-module(tut).
-export([incr/1]).

Some_ets = ets:new(?MODULE, [bag]).

incr(X) ->
    X+1.

但是我能够在一个函数中声明ETS,例如:

-module(tut).
-export([incr/1]).

incr(X) ->
    Some_ets = ets:new(?MODULE, [bag]),
    X+1.

我不能在函数外声明ETS吗?



1> Alan Moore..:

不 - 与其他语言不同,没有静态初始化的概念 - Erlang系统没有适当的时间来执行那段代码.

然而,Erlang确实具有参数化模块的概念,这可能就是您所追求的.看看这里http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang这是一个很好的写作 - 它将允许你实例化你的"实例" tut模块绑定到给定的ets表,并在模块函数调用中显式保存遍历该句柄.

或者如果你进入OTP,你可以在状态变量中传递ets表的句柄:

init(_) ->
    Some_ets = ets:new(?MODULE, [bag]),
    {ok, Some_ets}.

and then use it in your handle_call methods:

get_ets_handle() ->
    gen_server:call(?MODULE, {getETSHandle}, infinity).

handle_call({getETSHandle}, _From, Some_ets) ->
    {reply, Some_ets, Some_ets}.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有