繁体   English   中英

如何从检索到的元素访问各个“列”?

[英]How to access individual “columns” from retrieved element?

有什么方法可以从ETS表中检索元素并访问,例如列1,而无需将对象作为记录插入ETS?

我唯一看到过类似语法的地方,是引用每一列的是match参数上的'$ 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', '_'}).

意思是:

匹配由三列组成的所有条目,其中第二个元素是原子“ italy”。 丢弃第三个参数,因为我只对第一个参数感兴趣。

这将返回:

[[silvio],[roberto]]

或者,您可以执行以下“选择”操作:

5> ets:select(people, [{{'$1', '$2', '$3'},
                       [{'==', '$2', italy}],
                       [['$3']]}]).

意思是:

在由三个“列”组成的所有条目上进行选择,其中第二个元素等于“ italy”,仅返回第三个元素。

在您的情况下,将返回:

[[joker],[employee]]

切记,实际上非常有效的匹配操作已实现为BIF,因此它们将在执行时停止其他进程。 这意味着对于大型表,您应该查看其他机制,例如“ 遍历ETS表 ”。

希望这可以帮助。

ets:lookup_element对于检索单个列非常有效(与使用ets:lookup检索整个记录相反),尤其是在表中有长记录(元组)的情况下。

编辑:并且,如果要更新记录的某个列而不必重新插入整个元组,则可以使用ets:update_element / 3 (实际上,问题可能仅此而已,对我来说还不是很清楚。无论如何,现在两种情况都可以回答了:)

另外,如果更新是关于增加计数器,请使用ets:update_counter / 3 这是原子的,因此您不必执行lookup-increment-update(非原子)序列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM