9

コード内でタプルを使用してレコードを指定するのは悪い習慣だと聞いたことがあります。#record_name{record_field = something}通常のタプルではなく、常にレコード フィールド () を使用する必要があります{record_name, value1, value2, something}

しかし、ETS テーブルに対してレコードを照合するにはどうすればよいでしょうか? レコードを含むテーブルがある場合、次のものとのみ一致できます。

ets:match(Table, {$1,$2,$3,something}

レコード定義にいくつかの新しいフィールドを追加すると、このパターン マッチが機能しなくなることは明らかです。

代わりに、次のようなものを使用したいと思います。

ets:match(Table, #record_name{record_field=something})

残念ながら、空のリストを返します。

4

3 に答える 3

17

問題の原因は、を実行したときに指定されていないフィールドが何に設定されているかです#record_name{record_field=something}これはレコードを作成するための構文です。ここでは、ETSがパターンとして解釈するレコード/タプルを作成しています。レコードを作成すると、指定されていないすべてのフィールドに、レコード定義で定義されたデフォルト値またはデフォルトのデフォルト値のいずれかのデフォルト値が取得されますundefined

したがって、フィールドに特定の値を指定する場合は、たとえば、レコードで明示的にこれを行う必要があります#record_name{f1='$1',f2='$2',record_field=something}。多くの場合、レコードとetsを使用する場合、指定されていないすべてのフィールドを'_'、ets一致の「ドントケア変数」に設定する必要があります。これには、特別な、または違法なフィールド名を使用した特別な構文があります_。たとえば#record_name{record_field=something,_='_'}

この例では、タプルのレコード名要素を「$1」に設定していることに注意してください。レコードを表すタプルは、常に最初の要素としてレコード名を持ちます。つまり、etsテーブルを作成するときは、キーの位置を{keypos,Pos}デフォルト1以外の値に設定する必要があります。そうしないと、インデックスが作成されず、「set」または「ordered_set」タイプのテーブルがある場合はさらに悪いことになります。テーブル内の1つの要素。レコードフィールドのインデックスを取得するに#Record.Fieldは、例の構文を使用できます#record_name.record_field

于 2011-09-29T10:33:45.607 に答える
10

使ってみて

ets:match(Table, #record_name{record_field=something, _='_'})

説明については、これを参照してください。

于 2011-09-29T10:28:37.700 に答える
4

お探しのフォーマットは #record_name{record_field=something, _ = '_'} です

http://www.erlang.org/doc/man/ets.html#match-2

http://www.erlang.org/doc/programming_examples/records.html (1.3 レコードの作成を参照)

于 2011-09-29T10:48:54.237 に答える