erlang ets选择奇怪的行为

use*_*422 4 erlang ets

我在erlang中有一个奇怪的行为:ets:select.

我实现了一个正确的select语句(下面的4和5),然后我在我的语句中出错(下面的6),然后我再次尝试与4和5中相同的语句,并且它不再起作用.

怎么了 ?任何的想法 ?

Erlang R14B01 (erts-5.8.2) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.2  (abort with ^G)
1> Tab = ets:new(x, [private]).
16400
2> ets:insert(Tab, {c, "rhino"}).
true
3> ets:insert(Tab, {a, "lion"}). 
true
4> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2']}]).      
["rhino","lion"]    
5> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2']}]).      
["rhino","lion"]
6> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2', '$3']}]).
** exception error: bad argument
 in function  ets:select/2
    called as ets:select(16400,[{{'$1','$2'},[],['$1','$2','$3']}])
7> ets:select(Tab,[{{'$1','$2'},[],['$1', '$2']}]).      
** exception error: bad argument
 in function  ets:select/2
    called as ets:select(16400,[{{'$1','$2'},[],['$1','$2']}])
Run Code Online (Sandbox Code Playgroud)

我的ets表被破坏了吗?它会成为ets的错误吗?

谢谢.

Tha*_*dis 6

shell进程创建了ETS表,并且是它的所有者.当所有者进程终止时,将自动删除ETS表.

所以当你得到异常时6,shell进程就会死掉,所以删除了ETS表.

使它private也意味着没有其他进程可以访问它(因此即使表持久化,新shell也无法访问它),但在这种情况下,由于表已被删除,情况更糟.