2

我现在正在研究rabbitmq源代码来学习erlang技术。

以下来自rabbit_misc.erl文件。目的是检查应用程序的最低版本。在 的第 5 和第 7 分句中version_compare/N,有一个特殊字符,即$0。但是不知道是怎么回事?我不会发生这种情况的原因是,在最后一句中,lists:splitwith/N 之后,AT1并且BT1将以"$.".

version_compare(A, B, lte) ->
    case version_compare(A, B) of
        eq -> true;
        lt -> true;
        gt -> false
    end;
version_compare(A, B, gte) ->
    case version_compare(A, B) of
        eq -> true;
        gt -> true;
        lt -> false
    end;
version_compare(A, B, Result) ->
    Result =:= version_compare(A, B).

version_compare(A, A) ->
    eq;
version_compare([], [$0 | B]) ->
    version_compare([], dropdot(B));
version_compare([], _) ->
    lt; %% 2.3 < 2.3.1
version_compare([$0 | A], []) ->
    version_compare(dropdot(A), []);
version_compare(_, []) ->
    gt; %% 2.3.1 > 2.3
version_compare(A,  B) ->
    {AStr, ATl} = lists:splitwith(fun (X) -> X =/= $. end, A),
    {BStr, BTl} = lists:splitwith(fun (X) -> X =/= $. end, B),
    ANum = list_to_integer(AStr),
    BNum = list_to_integer(BStr),
    if ANum =:= BNum -> version_compare(dropdot(ATl), dropdot(BTl));
       ANum < BNum   -> lt;
       ANum > BNum   -> gt
    end.
4

1 回答 1

0

$0 不是特殊字符——这是零字符串:“0”。

版本可能很复杂:0.1.22.333 和 splitwith/2 分为头部和尾部(“0”和“.1.22.333”)。

我想处理 $0 是针对“1.0.0”和“1”这样的情况

{"1",".0.0"} vs {"1",[]}
于 2012-06-06T00:47:06.497 回答