erlangでetsテーブルのフィールド情報(つまりフィールド名)を見つける方法は何ですか?
ets:info(TableName)、ets:i(TableName)を試しました。1つ目は、メモリ、所有者、サイズ、named_table、keypos、protectionなどのテーブルに関する詳細を示します。2つ目は、テーブルに存在するエントリに関する詳細を示します。
問題は、ETSがレコードではなくタプルで機能するため、フィールド名自体がないことです。レコードを使用する場合でも、ETSはタプルのみを認識します。
Mnesiaはレコードを使用し、それについて知っています。
編集:@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要素のタプルを3つ追加しました。レコードを使用してテーブル要素を定義する場合は、インデックスとして使用するレコードフィールドのインデックスにキー位置を設定する必要があることを覚えておくことが重要です。デフォルトでは、キーの位置は1です。これは単なるレコード名であり、通常は必要なものではありません。
「パターン」を使用して、テーブルからオブジェクトを取得できます。Erlangにはパターンデータ型がなく、実際に行っているのは、パターンとして解釈されるタプルを構築することです。これらの「パターン」では、アトム、、、...'$1'は変数として解釈され、アトムはドントケア変数として解釈されます。したがって、タプルをパターンおよび変数として使用でき、レコードフィールドとそれぞれに「バインド」されます。これは、関数で実行されることであり、の拡張形式でも実行されます。'$2''$3''_'{foo,'$1','_','$2'}'$1''$2'acets:matchets:match_objectets:match_objectets:select
レコード定義を使用してこれらの「パターン」を生成し、テーブルから要素を取得することもできます。レコードコンストラクタ構文を使用するだけなので#foo{a='$1',b='_',c='$2'}、前の段落の例と同じタプル「パターン」を生成します。これらの「パターン」を生成するのに非常に役立つレコードの特別な構文がいくつかあります。特別な(通常は不正な)フィールド名_は、コンストラクターで明示的に指定されていないすべてのフィールドのデフォルト値を定義するために使用されます。したがって、これらの場合_='_'、指定されていないすべてのフィールドを「ドントケア変数」に設定するために使用できます'_'。etsマッチングのパターンに最適です。したがって、「パターン」#foo{b=49,_='_'}はタプルになり{foo,'_',49,'_'}ます。
注意:これらは通常のパターンマッチングで使用される通常のパターンではなく、ETSによってパターンとして解釈されるデータです。非常に異なるもの。
ここで少し船外に出てすみません、私は夢中になりました。