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

Leave a Reply

Leave a Reply