下面的代码给出了一个错误:“前面的语法错误: 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吗?
发布于 2009-06-12 22:56:50
不--与其他语言不同,没有静态初始化的概念-- Erlang系统没有适当的时间来执行这段代码。
然而,Erlang确实有参数化模块的概念,这可能就是您所追求的。在这里查看一下http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang,这是一个很好的编写-它将允许您实例化绑定到给定ets表的tut模块的“实例”,并在模块函数调用中显式地传递该句柄。
如果您进入OTP,则可以在state变量中传递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}.发布于 2009-06-12 19:39:20
您不能在模块中执行这样的变量赋值。见这里。
https://stackoverflow.com/questions/988222
复制相似问题