[erlang-questions] Comparing (pattern-matching) records

Joe Armstrong <>
Sat Mar 31 10:06:03 CEST 2012


You wrote

> #rec{} = #rec{a=1}.

When used on the righthand side of '='
#rec{} is a constructor which creates a new record.
On the left hand side of '=' #rec{} is a *pattern* the above line
means the same as if you had written:

> #rec{a=_,b=_} = #rec{a=1}.

In a record pattern you only need to include the
tags you want to constrain.

So

> #rec{a=1} = #rec{}

Means the same as

> #rec{a=1,b=_} = #rec{}

The RHS is a constructor and evaluates to
#rec{a=1,b=undefined}


The Lhs is a pattern and the match works.

/Joe




On Sat, Mar 31, 2012 at 9:37 AM, Avinash Dhumane <> wrote:
> I might have overlooked all the 3 books (for sections on records), but
> couldn't find an explanation why a pattern matching error doesn't occur in
> the last (7th) shell expression below.
>
> Please.
>
> Thanks.
>
> $ cat rec.hrl
> -record(rec, {a, b}).
> $ erl
> Erlang R14B02 (erts-5.8.3) [smp:2:2] [rq:2] [async-threads:0]
>
> Eshell V5.8.3  (abort with ^G)
> 1> rr("rec.hrl").
> [rec]
> 2> A=#rec{}.
> #rec{a = undefined,b = undefined}
> 3> B=#rec{a=1}.
> #rec{a = 1,b = undefined}
> 4> A=B.
> ** exception error: no match of right hand side value #rec{a = 1,b =
> undefined}
> 5> {} = {1}.
> ** exception error: no match of right hand side value {1}
> 6> {rec, undefined, undefined} = {rec, 1, undefined}.
> ** exception error: no match of right hand side value #rec{a = 1,b =
> undefined}
> 7> #rec{} = #rec{a=1}.
> #rec{a = 1,b = undefined}
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions



More information about the erlang-questions mailing list