Erlang/ets:在得到"坏参数"后重置ets表?

Dav*_*ver 5 erlang ets

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

> ets:match(Tid, { [$r | '$1'] }, 1).
% this match works...
% Then, at some point, this comes up:
** exception error: bad argument
     in function  ets:match/3
        called as ets:match(24589,{[114|'$1']},1)
% And from then on, matches stop working:
> ets:match(Tid, { [$r | '$1'] }, 1).
** exception error: bad argument
     in function  ets:match/3
        called as ets:match(24589,{[114|'$1']},1)

有没有办法"重置" ets系统,以便我可以再次查询它(即从shell)?

*:我无法重现这个问题......但是当我试图做"其他事情"时,它经常发生.

Dal*_*und 12

虽然我不是100%肯定,但这个主题似乎回答了你的问题.您似乎正在shell中观察此行为.如果是这样,两个事实以令人困惑的方式相互作用:

  1. 一旦其拥有进程终止,就会删除ets表.
  2. 当erlang shell收到异常并以静默方式重新启动时,它将死掉.

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