【问题标题】:version compare function, about special character版本比较功能,关于特殊字符
【发布时间】:2012-06-10 00:44:07
【问题描述】:

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

以下内容来自rabbit_misc.erl 文件。目的是检查应用程序的最低版本。 在version_compare/N的第5和第7子句中,有一个特殊字符,即$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.

【问题讨论】:

    标签: erlang rabbitmq


    【解决方案1】:

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

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

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

    {"1",".0.0"} vs {"1",[]}
    

    【讨论】:

    • 或者更确切地说,它是字符 0 的 Latin1 值,即 48。$c 是字符的 Latin1(和 unicode)值的语法糖。
    猜你喜欢
    • 2017-05-02
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2015-04-17
    相关资源
    最近更新 更多