Erlang之ETS学习02

1. ets:match/2

根据匹配模式 Pattern 匹配 ETS 表 Tab 里的对象数据。
一个匹配模式也许包含的项值有:绑定部分(Erlang 项),‘_’ 可以匹配任何 Erlang 项,和匹配变量:‘$N’(N>=0)
函数将返回一个匹配每个对象数据的元素的列表,每个元素是一个绑定变量模式的有序列表。

1>  ets:new(my_table, [set, named_table]).
my_table
2> ets:insert(my_table, {person, "Alice"}).
true
3> ets:insert(my_table, {person, "Bob"}).
true
4> ets:insert(my_table, {person, "Charlie"}).
true
5> ets:insert(my_table, {age, 30}).
true
6> ets:insert(my_table, {age, 25}).
true
7> ets:match(my_table, {'_', "Alice"}).
[]
8> ets:match(my_table, {'_', "ACharlie"}). 
[]
9> ets:match(my_table, {'_', "Charlie"}).  
[[]]
10> ets:match(my_table, {'_', Charlie}).   
* 1: variable 'Charlie' is unbound
%% 匹配到了最后插入的人名字为什么返回的是一个空数组
11> ets:match(my_table, {'_', "Charlie"}).
[[]]
12> ets:match(my_table, {'_', "Alice"}).   
[]
13> ets:match(my_table, {'_', "Bob"}).   
[]
14> ets:insert(my_table, {person, "Zheng"}).   
true
15> ets:match(my_table, {'_', "Charlie"}).   
[]
16> ets:match(my_table, {'_', "Zheng"}).   
[[]]

为了更好的展示效果这次我们采用bag类型的表

19> Tab1 = ets:new(ets_tab, [named_table, set]),                               
ets:insert(Tab1, [{rufsen, dog, 7}, {brunte, horse, 5}, {ludde, dog, 5}]), 
ets:match(Tab1, '$1').                                                     
[[{rufsen,dog,7}],[{ludde,dog,5}],[{brunte,horse,5}]]
20> ets:match(Tab1, {_,_,7}). 
* 1: variable '_' is unbound
21> ets:match(Tab1, {'_','_',7}). 
[[]]
22> ets:match(Tab1, {'_','_',1}). 
[]
23> ets:match(Tab1, {'_','_',5}). 
[[],[]]
24> ets:match(Tab1, {'_',dog,5}). 
[[]]
25> ets:match(Tab1, {'_',dog,7}). 
[[]]
%%当我们开始使用变量来匹配时便不是空数组了
26> ets:match(Tab1, {'$1',dog,7}). 
[[rufsen]]
27> ets:match(Tab1, {'$1','$2',7}). 
[[rufsen,dog]]

看到这个例子,我带盖知道什么原因了:

  1. ’ _ ‘可以匹配任何 Erlang 项但是,’ _ ‘对应位置的值不会出现在结果的数组里面,要想对应的值出现在结果数组里面则需要使用’$1’,'$2’这种变量来匹配
    最后我们再来试一下直接匹配对应的值
37> Tab = ets:new(ets_tab, [named_table, bag]). 
ets_tab
38> ets:insert(Tab, [{rufsen, dog, 7}, {brunte, horse, 5}, {ludde, dog, 5}]).
true
39> ets:match(Tab, {'_', '$1', '$2'}).
[[dog,7],[dog,5],[horse,5]]
40> ets:match(Tab, {rufsen, '$1', '$2'}). 
[[dog,7]]
41> ets:match(Tab, {'_', '$1', 5}).       
[[dog],[horse]]
42>

这样也是可以的,但是一定要是变量匹配的值才会出现在结果列表里面

2. ets:match/3 与 ets:match/1

match(Tab, Pattern, Limit) -> {[Match], Continuation} | $end_of_table
跟 ets:match/2 一样,都是根据匹配模式 Pattern 匹配表 Tab 里的对象数据,但是 ets:match/3 只返回 Limit 条的匹配数据。返回结果里还同时返回变量 Continuation,这可作为下一次调用 ets:match/1 方法的参数来获取下一批的匹配数据,这比使用 ets:first/1 和 ets:next/2 方法遍历获取表里的对象数据会更快,更有效率。

如果表为空,则返回 ‘$end_of_table’。

1> Tab = ets:new(ets_tab, [named_table, bag]),
ets:insert(Tab, [{rufsen, dog, 7}, {brunte, horse, 5}, {ludde, dog, 5}]),
{Match, _Continuation} = ets:match(Tab, '$1', 2),
Match.
[[{ludde,dog,5}],[{brunte,horse,5}]]
2> _Continuation.
{ets_tab,229,2,#Ref<0.2639193521.1568276481.141293>,[],0}
3> ets:match(_Continuation).                         
{[[{rufsen,dog,7}]],'$end_of_table'}
4> Continuation01 = ets:match(_Continuation). 
{[[{rufsen,dog,7}]],'$end_of_table'}
5> Continuation02 = ets:match(Continuation01). 
** exception error: bad argument
     in function  ets:match/1
        called as ets:match({[[{rufsen,dog,7}]],'$end_of_table'})
6>
``
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值