Декларация ETS в Эрланге - PullRequest
1 голос
/ 12 июня 2009

Следующий код дает мне ошибку: "синтаксическая ошибка перед: 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 вне функции?

Ответы [ 2 ]

9 голосов
/ 13 июня 2009

Нет - в отличие от других языков, нет концепции статической инициализации - у системы 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}.
1 голос
/ 12 июня 2009

Вы не можете делать такие переменные в модуле. Смотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...