我一直在学习如何使用 ets,但让我感到困扰的一件事是,偶尔*,ets:match 会抛出一个 bad argument ......而且,从它们开始,所有后续调用(甚至以前有效的调用)也会抛出一个 bad argument :

> ets:match(Tid, { [$r | '$1'] }, 1)。
% 这场比赛有效...
%然后,在某些时候,出现了:
** 异常错误:参数错误
在函数 ets:match/3
称为 ets:match(24589,{[114|'$1']},1)
% 从那时起,匹配停止工作:
> ets:match(Tid, { [$r | '$1'] }, 1)。
** 异常错误:参数错误
在函数 ets:match/3
称为 ets:match(24589,{[114|'$1']},1)

有什么方法可以“重置”ets 系统,以便我可以再次查询它(即,从 shell )?

*:我无法重现这个问题……但是当我尝试做“其他事情”时它经常发生。

最佳答案

虽然我不是 100% 确定,但 this thread 似乎可以回答您的问题。看来您正在 shell 中观察这种行为。如果是这样,两个事实正在以一种令人困惑的方式相互作用:

  • ets 表在其拥有进程终止后立即被删除。
  • erlang shell 会在收到异常时终止并静默重启。

  • 因此,当您遇到第一个异常时,当前的 shell 进程将终止,导致 ets 表被删除,然后为您启动一个新的 shell 进程。现在,当您尝试另一个 ets:match 时,它​​会失败,因为该表不再存在。

    关于Erlang/ets : reset ets table after getting a "bad argument"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1964990/

    10-13 02:06