2009-06-12 118 views
1

宣言ETS的下面的代碼給我一個錯誤:「之前的語法錯誤: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嗎?

回答

9

沒有 - 與其他語言不同,沒有靜態初始化的概念 - 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}. 
+0

面向對象的函數式編程!我喜歡它!我的流行詞 - 測量儀剛剛傾斜! – 2009-06-15 14:13:58

1

你不能在模塊中做類似的變量賦值。請參閱here