Я пытаюсь определить запись #a и запись #b так, что #b расширяет #a, так что я могу трактовать #b (и другие подтипы #a) как #a в некоторых ситуациях.Компилятору, однако, это не нравится, и он продолжает пытаться угадать тип записи, основываясь на первом доступе к нему.Следующий код вызывает предупреждение.
-module(sandbox).
-record(a,{alfa,beta}).
-record(b,{alfa,beta,gama}).
-export([test/0]).
test() ->
A = #b{alfa=1,beta = 2,gama=3},
self()!{msg,A},
receive
{msg,Msg} ->
Alfa = Msg#b.alfa,
Beta = Msg#b.beta,
case is_record(Msg,b) of
true ->
Gama = Msg#b.gama;
false-> %% Warning. Erlang assumes that Msg is a #b and therefore this will never match.
Gama = []
end
end,
io:format("~p ~p ~p",[Alfa,Beta,Gama]).
test1() ->
A = #b{alfa=1,beta = 2,gama=3},
self()!{msg,A},
receive
{msg,Msg} ->
Alfa = Msg#a.alfa,
Beta = Msg#a.beta,
case is_record(Msg,b) of
true -> %% Warning. Erlang assumes that Msg is an #a, and therefore this will never match.
Gama = Msg#b.gama;
false->
Gama = []
end
end,
io:format("~p ~p ~p",[Alfa,Beta,Gama]).
Можно ли в любом случае использовать этот подтип и убрать предупреждение о компиляции?Спасибо.