2

私は現在、erlangテクニックを学ぶためにrabbitmqソースコードを研究しています。

以下はrabbit_misc.erlファイルからです。目的は、アプリケーションの最小バージョンを確認することです。の5番目と7番目のサブセンテンスにversion_compare/Nは、特殊文字があり$0ます。しかし、私はそれがどのように起こるのか分かりませんか?それが起こらない私の理由は、lists:splitwith / Nの後の最後の文で、AT1BT1始まるということ"$."です。

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 に答える