【问题标题】:Declaration of ETS in ErlangErlang 中的 ETS 声明
【发布时间】:2014-01-06 21:13:39
【问题描述】:

下面的代码给了我一个错误:"syntax error before: 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 吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

    或者,如果您使用 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}.
    

    【讨论】:

    • 面向对象的函数式编程!我喜欢它!我的流行语-o-meter 刚刚倾斜!
    【解决方案2】:

    您不能在模块中进行这样的变量赋值。见here

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2012-08-07
      • 2016-06-03
      • 2012-10-14
      • 2014-11-30
      • 2018-09-25
      • 2015-10-27
      • 2010-12-19
      • 2017-03-01
      相关资源
      最近更新 更多