3

Erlang R15B でテストします。

-spec parse_packet(integer(), binary()) -> list().

parse_packet(16013, <<0:16, _/binary>>) -> [];
parse_packet(16013, <<ListNum:16, ListBin/binary>>) ->
SizePerMount = byte_size(ListBin) div ListNum,
(1)Fun = fun(_, [<<MountBin:SizePerMount/binary, T/binary>>, Acc]) ->
              <<MountId:32, _:32, GoodsTypeId:32, _/binary>> = MountBin,
              [T, [{GoodsTypeId, MountId}|Acc]]
      end,
[_, MountIds] = lists:foldl(Fun, [ListBin, []], lists:seq(1, ListNum)),
(2)lager:info("MountList:~p", [MountIds]),
MountIds.

Dialyzer は、(1) と (2) で「作成された楽しみにはローカル リターンがない」と不満を漏らします。

(1) を実行するには、次の更新で十分だと思いました。

Fun = fun(_, [<<MountBin:SizePerMount/binary, T/binary>>, Acc]) ->
              <<MountId:32, _:32, GoodsTypeId:32, _/binary>> = MountBin,
              [T, [{GoodsTypeId, MountId}|Acc]]
         (_, [T, Acc]) ->
              [T, Acc]
      end,

しかし、Dialyzer により多くの型情報を伝えるには、別の方法が必要だと思います。

誰でもアドバイスできますか?前もって感謝します。

4

0 に答える 0