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.
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
.