2012-06-06 18 views
2

我正在學習用於學習erlang技術的rabbitmq源代碼。版本比較函數,關於特殊字符

以下是來自rabbit_misc.erl的文件。目的是檢查應用程序的最低版本。 在version_compare/N的第5次和第7次轉換中,有一個特殊字符,它是$0。但我不知道它是如何發生的? 我之所以不會發生這樣的事情,是因爲在最後一次實施後,在列表之後: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. 

回答

0

$ 0不是一個特殊字符 - 這是零字符串: 「0」。

版本可能很複雜:0.1.22.333和splitwith/2分爲頭部和尾部(「0」和「.1.22.333」)。

我想,處理$ 0是像「1.0.0」和「1」

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

或者更確切地說它是字符'0'的Latin1的價值的情況下,48'$ C'是句法糖用於該角色的Latin1(和unicode)值。 – rvirding