我正在研究rabbitmq源代码,用于学习erlang技术。
以下内容来自rabbit_misc.erl
文件。目的是检查应用程序的最低版本。
在version_compare/N
的第5和第7子信道中,有一个特殊字符,即$0
。但我不知道它是怎么发生的?
我不会发生这种情况的原因是,在最后一次发送中,在列表后: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.
答案 0 :(得分:0)
$ 0不是特殊字符 - 这是零字符串:“0”。
版本可能很复杂:0.1.22.333和splitwith / 2拆分为head和tail(“0”和“.1.22.333”)。
我认为处理$ 0适用于“1.0.0”和“1”
等情况{"1",".0.0"} vs {"1",[]}