0

我正在尝试使用相同的记录创建两个具有两个不同名称的表,但它只创建其中任何一个,或者有时会引发异常。

以下是我的记录文件中的代码:

-record(account,{acctnum, cnic, name, address,date ,time, balance=0}).

以下是我来自名为帐户的模块的代码:

-module(accounts).
-compile(export_all).
-include("records.hrl").
start()->
ets:new(current,[named_table,{keypos, #account.cnic}]),
ets:new(savings,[named_table,{keypos, #account.cnic}]).

有时它会返回一个名为 Savings 的原子,但有时它会给出以下错误:

** 异常错误:函数 ets:new/2 中的错误参数被称为 ets:new(current,[named_table,{keypos,3}]) 在来自 accounts:start/0 的调用中(accounts.erl,第 5 行)

请让我知道是否可以使用单个记录在 ets 中创建两个表?如果没有,那么我该如何实现它,我正在尝试创建两个表,一个用于储蓄账户,另一个用于活期账户,我该如何解决这个问题?

4

2 回答 2

1

基于一个记录创建两个 ETS 没有问题。

** exception error: bad argument
     in function  ets:new/2
        called as ets:new(current,[named_table,{keypos,3}])
     in call from accounts:start/0 (accounts.erl, line 5)

这种异常通常意味着已经创建了同名表。即函数start被调用了两次(第一次成功,第二次没有)。

于 2013-05-17T15:56:34.787 回答
0

当你第一次执行 start 时,一切正常,你在函数的最后一行得到结果。您可以使用 tv 模块进行检查;执行 tv:start() 你可以检查任何 ets 或 mnesia 表。如果你再次执行 start,那么正如 Alexey 所说,你会得到一个错误,因为表当前(和保存)已经存在。这会使 shell 崩溃,并破坏 2 个表;所以下次你使用start时,它会再次正常。

如果您不知道 ets 表是否已经存在,您可以使用如下代码对其进行测试:

ensure(T,Def) ->
    case ets:info(T) of
        undefined -> ets:new(T,Def);
        _ -> ets:delete_all_objects(T) %% or anything you need to do in this case
    end.
于 2013-05-19T07:05:52.417 回答