Как найти информацию о полях таблицы? - PullRequest
2 голосов
/ 26 октября 2011

Как найти информацию о полях (т.е. имена полей) для таблицы ets в erlang?

Я пробовал ets: info (TableName) , ets: i (TableName) . Первый дает подробную информацию о таблице, такую ​​как память, владелец, размер, named_table, keypos, защита и т. Д. Второй дает подробную информацию о записях, присутствующих в таблице.

1 Ответ

3 голосов
/ 26 октября 2011

Проблема в том, что ETS работает с кортежами , а не с записями, поэтому имена полей как таковые отсутствуют. Даже если вы используете записи, ETS видит только кортежи.

Мнесия использует и знает о записях.

РЕДАКТИРОВАТЬ: более длинный комментарий к комментарию @ niting112.

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

Поскольку ETS работает с кортежами, мы можем использовать записи для определения кортежей, которые находятся в таблице. Так что если у нас есть:

-define(foo, {a,b=0,c}).

тогда мы можем добавить объекты в таблицу, используя:

ets:insert(Table, #foo{a="Joe",c=1}),
ets:insert(Table, #foo{a="Robert,c=2}),
ets:insert(Table, #foo{a="Mike",c=3}),

и мы добавили три кортежа по 4 элемента в каждом. Важно помнить, что если мы используем записи для определения элементов таблицы, мы должны обязательно установить ключевую позицию в качестве индекса поля записи, которое мы хотим использовать в качестве индекса. По умолчанию позиция ключа равна 1, что является просто именем записи, которое обычно не то, что мы хотим.

Мы можем использовать «шаблоны» для извлечения объектов из таблицы. Помните, что в Erlang нет типового шаблона, и мы действительно создаем кортежи, которые интерпретируются как шаблоны. В этих «шаблонах» атомы '$1', '$2', '$3', ... интерпретируются как переменные, а атом '_' интерпретируется как переменная, не заботящаяся. Таким образом, мы могли бы использовать кортеж {foo,'$1','_','$2'} в качестве шаблона, и переменные '$1' и '$2' будут «связывать» поля записей a и c соответственно. Это то, что делается с функциями ets:match, ets:match_object и ets:match_object, а также в расширенной форме в ets:select.

Мы также можем использовать определения записей для генерации этих «шаблонов» для извлечения элементов из таблицы. Мы просто используем синтаксис конструктора записи, поэтому #foo{a='$1',b='_',c='$2'} генерирует тот же «шаблон» кортежа, что и пример в предыдущем абзаце. Существует некоторый специальный синтаксис для записей, который ОЧЕНЬ полезен для генерации этих «шаблонов»: специальное (и обычно недопустимое) имя поля _ используется для определения значения по умолчанию для всех полей, которые явно не заданы в конструкторе. Таким образом, в этих случаях мы можем использовать _='_', чтобы установить для всех неуказанных полей значение «позаботиться о переменной» '_'. Идеально подходит для шаблонов в ETS соответствия. Таким образом, «шаблон» #foo{b=49,_='_'} становится кортежем {foo,'_',49,'_'}.

N.B. Это не нормальные шаблоны, используемые в нормальном сопоставлении с образцами, но данные, интерпретируемые ETS как шаблоны. Совсем разные вещи.

Извините за то, что вы немного за борт, я увлекся.

...