Wie passt man ETS: Match gegen einen Rekord in Erlang?

8

Ich habe gehört, dass die Angabe von Datensätzen über Tupel im Code eine schlechte Übung ist: Ich sollte immer Datensatzfelder ( #record_name{record_field = something} ) anstelle von einfachen Tupeln {record_name, value1, value2, something} verwenden.

Aber wie passe ich den Datensatz an eine ETS-Tabelle an? Wenn ich eine Tabelle mit Datensätzen habe, kann ich nur mit folgendem übereinstimmen:

%Vor%

Es ist offensichtlich, dass diese Musterübereinstimmung aufhört zu arbeiten, sobald ich der Rekorddefinition einige neue Felder hinzugefügt habe.

Stattdessen möchte ich etwas wie folgt verwenden:

%Vor%

Leider gibt es eine leere Liste zurück.

    
skanatek 29.09.2011, 08:50
quelle

3 Antworten

16

Die Ursache Ihres Problems liegt in den nicht angegebenen Feldern, wenn Sie #record_name{record_field=something} ausführen. Dies ist die Syntax für Erstellen eines Datensatzes, hier erstellen Sie einen Datensatz / Tupel, den ETS als Muster interpretiert. Wenn Sie einen Datensatz erstellen, erhalten alle nicht angegebenen Felder ihre Standardwerte, entweder die in der Datensatzdefinition definierten Werte oder den Standardstandardwert undefined .

Wenn Sie also Feldern bestimmte Werte zuweisen möchten, müssen Sie dies explizit im Datensatz angeben, z. B. #record_name{f1='',f2='',record_field=something} . Bei der Verwendung von Datensätzen und Ets müssen Sie alle unspezifizierten Felder auf '_' setzen, die Variable "egal" für die Übereinstimmung von ets. Hierfür gibt es eine spezielle Syntax, die den speziellen und ansonsten illegalen Feldnamen _ verwendet. Zum Beispiel #record_name{record_field=something,_='_'} .

Beachten Sie, dass Sie in Ihrem Beispiel das Element Datensatzname im Tupel auf '$ 1' gesetzt haben. Das Tupel, das einen Datensatz darstellt, hat immer den Datensatznamen als erstes Element. Das heißt, wenn Sie die ETS-Tabelle erstellen, sollten Sie die Schlüsselposition mit {keypos,Pos} auf etwas anderes als die Standard 1 setzen, sonst wird es keine Indizierung geben und schlimmer, wenn Sie eine Tabelle vom Typ 'set' oder ' ordered_set 'Sie erhalten nur 1 Element in der Tabelle. Um den Index eines Datensatzfeldes zu erhalten, können Sie die Syntax #Record.Field verwenden, in Ihrem Beispiel #record_name.record_field .

    
rvirding 29.09.2011, 10:33
quelle
9

Versuchen Sie es mit

%Vor%

Sehen Sie dies zur Erklärung.

    
gleber 29.09.2011 10:28
quelle
4

Das Format, nach dem Sie suchen, ist #record_name {record_field = something, _ = '_'}

Ссылка

Ссылка (siehe 1.3 Erstellen eines Datensatzes)

    
Paul Peregud 29.09.2011 10:48
quelle

Tags und Links