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

随心笔谈2个月前发布 admin
206 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章介绍了Erlang模式匹配的原理及其在不同场景中的应用,重点围绕赋值时匹配和流程控制中的匹配展开。 在赋值时匹配部分,文章详细讨论了原子匹配、变量匹配、元组匹配、列表匹配和参数匹配。这些机制通过结构化比较实现变量或表达式的匹配,例如原子变量的直接比较、变量名的匹配、结构化的元组和列表比较,以及函数参数的模式匹配。 在流程控制中的匹配部分,文章介绍了使用模式匹配实现的if语句、case语句、try-catch结构以及消息传递匹配。例如,模式匹配用于判断表达式类型并执行相应的分支处理,try-catch中的模式匹配用于处理异常并指定错误处理逻辑。此外,消息传递匹配用于进程间的消息接收与发送。 通过这些模式匹配机制,Erlang实现了高效、灵活的程序设计,提升了代码的可读性和维护性。



一、赋值时匹配

原子匹配

复制代码 代码如下:

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}}

© 版权声明

相关文章