Как получить доступ к отдельным «столбцам» из найденного элемента? - PullRequest
0 голосов
/ 21 марта 2012

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

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

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Если у вас есть следующее:

1> ets:new(people, [set, named_table]).
2> ets:insert(people, {silvio, italy, joker}).
3> ets:insert(people, {roberto, italy, employee}).

(Обратите внимание, что я добавляю универсальный кортеж в таблицу - запись - это просто кортеж, где первый элемент - это имя самой записи, и у вас есть некоторый синтаксический сахар для доступа к элементам записей -)

Вы можете выполнить следующую операцию 'match':

4> ets:match(people, {'$1', 'italy', '_'}).

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

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

Это вернет:

[[silvio],[roberto]]

В качестве альтернативы, вы можете выполнить следующую операцию «выбор»:

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

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

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

В вашем случае это вернет:

[[joker],[employee]]

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

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

1 голос
/ 21 марта 2012

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

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

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

...