Erlang中ETS的一些用法总结
2013-07-13 02:32
761 查看
前言:
Erlang里的ETS也用了一段时日了,在这里把自己的一些新的记录下来与大家分享一下,有任何不当之处欢迎噶为前辈高人指教怎么与RECORD相结合:
这个网络上有好多前辈已经写了过了,这里我再赘述一下.在Erlang中ETS可以和Record无缝结合,具体方法如下:
%% 示例代码 -record(account, {account_id, name, sex, email}). %% 创建账户表 | 以account的id作为记录对象的键. account = ets:new(account, [named_table, set, {keypos, #account.account_id}]). %% 查询性别为1的用户 ets:match_object(account, {'_', '_', '_', 1, '_'}). %% 非record方式 ets:match_object(account, #account{sex = 1, _='_'}). %% 使用RECORD,通用匹配部分为: _='_' %% 更新 ets:update_element(account, 1, {#account.name, "jason"}). %% 更新一个值 ets:update_element(account, 1, [{#account.name, "jason"}, {#account.email, "jason@gmail.com"}]). %% 更新多个值 %% 插入 AccountRecord = #acount{account_id = 1, name = "jason", sex = 1, email = "jason@gmail.com"}. ets:insert_new(account, AccountRecord).
大家应该看明白了吧,我一开始懒得费事键这些record,但到了后来,代码越来越多,功能越来越多,策划时不时的增加个东西,你修改这些个语句的匹配就成为了非常麻烦的事情.最后我也是在不厌其烦下改成了这种方式,发现自己真是活该找罪受啊.
关于MATCH的一些用法和小技巧:
match和match_object大多数人的意见都是能不用尽量不用,我也赞同这种说法,但你不可能逃脱的掉match的魔掌,所以,既然无法反抗那就享受吧.(你们猜得到我现在的表情吗?).
Continuation:不陌生是吧, 你用match的一些高级技巧一般都会出现这位大哥. 同样它也被作为参数用于ets:match/1,match_object/1等函数中.查看源码我们可以知道,
这个Continuation有3个值:
-type continuation() :: '$end_of_table' | {tab(),integer(),integer(),binary(),list(),integer()} | {tab(),_,_,integer(),binary(),list(),integer(),integer()}.
在使用match的时候我们可以,我们可以通过Continuation来设定一定的条件来进行匹查询.
例如:我们要查看消费积分排行在1238位的一个用户的前10个用户或后10个用户,我们就可以根据Continuation来设计一个这样的起始表达式.
但实际应用这个表达式的时候ets:match/match_object会提示你参数错误,这是为什么呢?根据源码观察,在系统调用match/match_object的时候,最后的返回如果带有Continuation,那这个结果一定是被重新编译过的.而我们自己手动编写的这个结构也只是一个简单的term.所以如果要使用我们自定义的这个Continuation,我们就必须调用repair_continuation/2这个函数.
repair_continuaton(Continuation, MatchSpec).
这里的Continuation就是我们自定义的那个,而MatchSpec,则需要调用ets:fun2ms来产生.
例如:
-record(pay_order, {order, uid}). -include_lib("stdlib/include/ms_transform.hrl"). %% 要使用ets:fun2ms/1必须引入此文件 MS = ets:fun2ms(fun(OrderRecord = #pay_order) -> [OrderRecord] end).
获取MS后就可以用这个MS来修复我们自定义的Continuation了,完成后,我们就可以使用我们自定义的Continuation了.
总结:
以上就是我在使用ETS的时候遇到的一些小问题的总结,总的来说就是2个方面,一个是ETS与Record的结合,一个就是在使用match/match_object等函数时会遇到的一些问题.这里着重讲了ets的一个返回类型Continuation.
至于ETS的一些基本问题,大家可以看各位大神的博客,都有很详细的介绍. 上文内容如有不当之处希望各位高人指正,小弟感激不尽.
相关文章推荐
- 关于Datagridview控件用法的一些总结(设置列chicun)
- Apache Pig的一些基础概念及用法总结(4)
- 总结一些Objective-C的self.用法
- MySQL中的insert ignore into, replace into等的一些用法总结
- Objective-C的self.用法的一些总结
- 数据库约束的一些用法总结(constraint)
- servlet的一些用法及相关知识的一些总结
- 有关正则表达式的一些用法总结
- css中的一些选择器的用法总结
- 关于sqlplus用法的一些总结
- Objective-C的self.用法的一些总结
- Objective-C的self.用法的一些总结
- Apache Pig的一些基础概念及用法总结(3)
- UIWebView的一些用法总结
- QString的一些用法总结(1 section, split 函数)
- Erlang初学:Erlang的一些特点和个人理解总结
- Shell编程的一些用法总结
- MySql的一些用法总结
- DropDownList 用法的一些学习总结
- SVN和Git的一些用法总结(转)