Erlang中的匹配模式总结(erlang -spec)速看

随心笔谈12个月前发布 admin
100 0



一、赋值时匹配

原子匹配

复制代码 代码如下:

atom   =atom                        % atom

another=another                     % another

atom   =another                     % exception error

变量匹配

复制代码 代码如下:

Var=2.                              % 2

Var=3 – 1.                          % 2

Var=1.                              % exception error

元组匹配

复制代码 代码如下:

Attr={name, sloger}.                % {name, sloger}

{name, Name}=Attr.                  % {name, sloger}

Name.                                 % sloger

列表匹配

复制代码 代码如下:

Langs=[perl, python, ruby, erlang].

[Head | Tail]=Langs.

Head.                                 % perl

Tail.                                 % [python, ruby, erlang]

参数匹配

复制代码 代码如下:

sum([]) -> 0;

sum([H|T]) -> H + sum(T).

sum([1, 2, 3]).                       % 6

记录匹配

复制代码 代码如下:
%% record(post, {title, slug, body, author}).

Post=#post{title=”Pattern Match in Erlang”,

             slug=”pattern-match-in-erlang”,

             body=”Bla bla bla…”,

             author=sloger}.

#post{title=Title, slug=Slug}=Post.

Title.                                % “Erlang 中的模式匹配总结”

Slug.                                 % “summary-of-pattern-match-in-erlang”

比特匹配

复制代码 代码如下:

Red=5.

Green=23.

Blue=200.

Color=<<Red:5, Green:6, Blue:5>>.

<<R1:5, G1:6, B1:5>>=Color.

R1.                                   % 5

G1.                                   % 23

B1.                                   % 200

二、流程控制中的匹配

if

复制代码 代码如下:

if

    Pattern1 [when Guard1] -> Expression1;

    Pattern2 [when Guard2] -> Expression2;

    %% and so on …

    _                      -> Expression3           % 匹配所有其它结果

end.

case

复制代码 代码如下:

case Expression of

    Pattern1 [when Guard1] -> Expression1;

    Pattern2 [when Guard2] -> Expression2;

    %% and so on …

    _                      -> Expression3

end.

try catch

复制代码 代码如下:

try FunctionOrExpressions of

    Pattern1 [when Guard1] -> Expression1;

    Pattern2 [when Guard2] -> Expression2

    %% and so on …

catch

    ExType:ExPattern1 [when ExGuard1] ->

        ExExpression1;

    ExType:ExPattern2 [when ExGuard2] ->

        ExExpression2;

    %% and so on …

    _:_ -> DefaultExExpression               % _:_ 匹配所有异常

after

    AfterExpressions

end

消息传递匹配

复制代码 代码如下:

loop() ->

    receive

        {From, {rectangle, Width, Height}} ->

            From ! {self(), Width * Height},

            loop();

        {From, {circle, R}} ->

            From ! {self(), 3.14 * R * R},

            loop();

        {From, _Other} ->

            From ! {self(), {error, unknown_shape}}

            loop()

    end.

Pid=spawn(fun loop/0).

Pid ! {self(), {rectangle, 10, 5}}.         % {Pid, 50}

Pid ! {self(), {circle, 4}}.                % {Pid, 50.24}

Pid ! {self(), {square, 10}}.               % {Pid, {error, unknown_shape}}

© 版权声明

相关文章