2012-03-21 3 views
0

Есть ли способ извлечь элемент из таблицы ETS и получить доступ, скажем, столбец 1, не вставляя объект в ETS в качестве записи?Как получить доступ к отдельным «столбцам» из извлеченного элемента?

Единственное место, где я видел похожий синтаксис, ссылаться на каждый столбец - с «$ 1» в аргументах соответствия.

+1

Элементы таблицы ets не являются строгими записями, но кортежи размером больше 1. Таким образом, вы можете получить доступ к [определенным элементам поиска] (http://erldocs.com/R14B02/stdlib/ets.html?i=2&search = # lookup_element/3) если хотите. – Keynslug

ответ

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']]}]). 

Что означает:

Выберите все записи из трех «столбцов», где второй элемент равен «италия», возвращая только третий элемент.

В вашем случае, что бы вернуть:

[[joker],[employee]] 

Bare в виду, что матч операций, чтобы быть действительно эффективными, были реализованы как BIFS, так что они будут останавливать другие процессы во время выполнения. Это означает, что для большой таблицы вы должны посмотреть другие механизмы, такие как «traversing an ETS table».

Надеюсь, это поможет.

+0

Спасибо. Возможно ли, что мы можем изменить №5 для выполнения «или», например, «италия» или «нигерия»? – mezamorphic

+1

[{'orelse', {'==', '$ 2', italy}, {'==', '$ 2', nigeria}}] –

+1

Вы можете использовать dbg: fun2ms/1 для создания этих спецификаций соответствия: dbg : fun2ms (fun ([A, B, C]), когда B == 'italy' orelse B == 'nigeria' -> [C] end). –

1

етсь: lookup_element является достаточно эффективным для получения одного столбца (в отличие от извлечения всей записи с ИТС: поиск), особенно если у вас есть длинные записи (кортежи) в таблице.

Edit: И если вы хотите обновления определенный столбец записи без необходимости заново вставить весь кортеж, вы можете использовать ETS: update_element/3. (На самом деле этот вопрос может быть только о том, что это не совсем ясно для меня Так или иначе, теперь оба случая ответили :).)

Кроме того, если обновление о инкремент счетчика, используйте ETS: update_counter/3.Это атомарно, поэтому вам не нужно выполнять последовательность поиска-инкремента-обновления (неатома).

Смежные вопросы