2009-06-12 9 views
1

Der folgende Code gibt mir eine Fehlermeldung: "Syntaxfehler vor: Some_ets"Erklärung ETS in Erlang

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

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

incr(X) -> 
    X+1. 

Aber ich bin in der Lage, die ETS innerhalb einer Funktion zu erklären, wie:

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

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

Kann ich eine ETS nicht außerhalb einer Funktion deklarieren?

Antwort

9

Nein - im Gegensatz zu anderen Sprachen gibt es kein Konzept der statischen Initialisierung - es gibt keine angemessene Zeit für ein Erlang-System, um diesen Code auszuführen.

Erlang hat jedoch das Konzept eines parametrisierten Moduls, und das mag das sein, wonach Sie suchen. Schauen Sie sich hier http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang an, was eine gute Beschreibung ist - es würde Ihnen erlauben, eine "Instanz" Ihres Tut-Moduls in einer gegebenen ETS-Tabelle zu instanziieren und das Umgehen dieses Handles explizit in Ihren Modulfunktionsaufrufen zu speichern.

Oder wenn Sie in OTP sind, könnten Sie den Griff in die ets-Tabelle in der Zustandsgröße herumgereicht haben:

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

Objektorientierte funktionale Programmierung! Ich liebe es! Mein Buzzword-O-Meter ist gerade kippen gegangen! –

1

Sie können keine Variablenzuweisungen in einem Modul vornehmen. Siehe here.