2012-03-21 54 views
0

有没有什么办法从ETS表中检索一个元素并访问(比方说第1列),而不将对象作为记录插入到ETS中?如何访问检索到的元素中的单个“列”?

我看过类似语法的唯一地方,就是参考每个列与匹配参数中的'$ 1'。

+1

ets表的元素不是严格记录,而是大小大于1的元组。因此,您可以访问[查找时的特定元素](http://erldocs.com/R14B02/stdlib/ets.html?i=2&search =#lookup_element/3)如果你愿意。 – Keynslug 2012-03-21 11:57:19

回答

3

假设你具备以下条件:

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”。

希望这会有所帮助。

+0

谢谢。是否有可能修改#5来执行“或”,如“意大利”或“尼日利亚”? – mezamorphic 2012-03-21 14:11:54

+1

[{'orelse',{'==','$ 2',italy},{'==','$ 2',nigeria}}] – 2012-03-21 14:20:44

+1

您可以使用dbg:fun2ms/1来生成这些匹配规范:dbg :fun2ms(fun([A,B,C])当B =='italy'orelse B =='nigeria' - > [C] end)。 – 2012-03-21 14:21:24

1

ETS:lookup_element是用于检索单个列(而不是与ETS检索整个记录:查找)非常有效,特别是如果你在表中早有记载(元组)。

编辑: 如果你想更新记录的某一列,而不必重新插入整个元组,你可以使用ETS:UPDATE_ELEMENT/3。 (其实这个问题可能只是有关,它不是完全清楚,我无论如何,现在这两种情况下都回答:))。

另外,如果更新是关于增加计数器,使用ETS:update_counter/3。这是原子的,所以你不必做查找增量更新(非原子)序列。