有没有什么办法从ETS表中检索一个元素并访问(比方说第1列),而不将对象作为记录插入到ETS中?如何访问检索到的元素中的单个“列”?
我看过类似语法的唯一地方,就是参考每个列与匹配参数中的'$ 1'。
有没有什么办法从ETS表中检索一个元素并访问(比方说第1列),而不将对象作为记录插入到ETS中?如何访问检索到的元素中的单个“列”?
我看过类似语法的唯一地方,就是参考每个列与匹配参数中的'$ 1'。
假设你具备以下条件:
1> ets:new(people, [set, named_table]).
2> ets:insert(people, {silvio, italy, joker}).
3> ets:insert(people, {roberto, italy, employee}).
(注意我加入一个通用的元组表 - 记录是一个简单的元组,其中第一个元素是记录自己的名义,你有一些语法糖来访问记录元素 - )
你可以做下面的‘匹配’操作:
4> ets:match(people, {'$1', 'italy', '_'}).
这意味着:
匹配由三列组成的所有条目,其中第二个元素是原子'意大利'。放弃第三个参数,因为我只对第一个参数感兴趣。
这将返回:
[[silvio],[roberto]]
或者,你可以执行以下 '选择' 操作:
5> ets:select(people, [{{'$1', '$2', '$3'},
[{'==', '$2', italy}],
[['$3']]}]).
这意味着:
选择上的所有条目由三个'列'组成,其中第二个元素等于'意大利',返回th仅限第三个元素。
在你的情况下,将返回:
[[joker],[employee]]
裸记住,匹配操作,真正做到高效,已实施了内建函数,所以在执行他们将停止其他进程。这意味着,对于大型表格,您应该查看其他机制,例如“traversing an ETS table”。
希望这会有所帮助。
谢谢。是否有可能修改#5来执行“或”,如“意大利”或“尼日利亚”? – mezamorphic 2012-03-21 14:11:54
[{'orelse',{'==','$ 2',italy},{'==','$ 2',nigeria}}] – 2012-03-21 14:20:44
您可以使用dbg:fun2ms/1来生成这些匹配规范:dbg :fun2ms(fun([A,B,C])当B =='italy'orelse B =='nigeria' - > [C] end)。 – 2012-03-21 14:21:24
ETS:lookup_element是用于检索单个列(而不是与ETS检索整个记录:查找)非常有效,特别是如果你在表中早有记载(元组)。
编辑: 如果你想更新记录的某一列,而不必重新插入整个元组,你可以使用ETS:UPDATE_ELEMENT/3。 (其实这个问题可能只是有关,它不是完全清楚,我无论如何,现在这两种情况下都回答:))。
另外,如果更新是关于增加计数器,使用ETS:update_counter/3。这是原子的,所以你不必做查找增量更新(非原子)序列。
ets表的元素不是严格记录,而是大小大于1的元组。因此,您可以访问[查找时的特定元素](http://erldocs.com/R14B02/stdlib/ets.html?i=2&search =#lookup_element/3)如果你愿意。 – Keynslug 2012-03-21 11:57:19