レコードレコード


メタグループ(tuple)はc/c++の構造体に似ているが,まだ柔軟ではない.たとえば、ビジネスに関連する5つの要素からなるメタグループです.ビジネス変更のため、フィールドを追加する必要があります.そのため、すべてのコードを走り、これらのメタグループに関連するすべての場所を変更しなければなりません.修正箇所が多ければ、間違いを犯しやすいです.そこで記録(record)概念を導入した.
次の例では、レコードの使用方法を簡単に説明します.
-module(record).
-export([test/0]).
-record( person, {name, addr="Shanghai"} ).                       %%     person record

test() ->
  test( #person{name="Zhangsan",addr="Beijing"} ).      %%     person record,   test/1

test( R = #person{name=_Name, addr=_Addr} ) ->                      %% record       
  io:format("{person,~p,~p}~n", [R#person.name,R#person.addr ]),    %%   record    
  R#person{addr=R#person.addr ++ "-China"}.             %%   record  (       record)

1.record宣言
record構文は、本質的にタグメタグループ(第1の要素は原子のメタグループ)であるレコードを使用することができます.
-record(customer, {name="<anonymous>",address, phone}).

{customer,name,address,phone}のメタグループに相当します.しかし、後でrecordを使用することに注意してください.recordフィールドの順序に関心を持つ必要はありません.
定義時にrecordフィールドはデフォルト値を使用できます
2.レコードの作成
#customer{}
#customer{phone="12345"}
#customer{phone="12345", name="John", address="L.A."}

もう一度強調しますが、recordはフィールドの順序に関心を持つ必要はありません.
3.レコードのフィールドを取得する
上記の3つの例のいずれかをRでバインドしたと仮定します.レコードの各フィールドには、#とポイント分割法でアクセスできます.
R#customer.name
R#customer.address
R#customer.phone

4.recordフィールドのパターンマッチング
print_contact( #customer{name=Name, address=_Addr, phone=Phone} )
                  when Phone =/= undefined ->
    io:format("Contact: ~p at ~p.~n",[Name, Phone]).

説明:使用しない変数に下線を付けると、コンパイル時の変数unusedアラートをブロックできます.
5.レコードの更新
既存のレコードに基づいて新しいレコードを作成
A = R,
B = R#customer{name="Jane"}.

6.''を使うマッチ
Customer = #{customer,name="Alan",_='_'}.

   _残りのメタグループの他の要素と一致するので、結果は#customer{name="Alan",address='',phone=''}である.