las*_*aro 1 erlang record compiler-warnings
我正在尝试定义记录#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]).
Run Code Online (Sandbox Code Playgroud)
无论如何我可以使用这个子类型并使编译警告消失吗?谢谢.
我不认为这可行,因为"-record(a,{alfa,beta})." 是"{a,alfa,beta}"和"-record(b,{alfa,beta,gama})的模板." 结果是一个元组"{b,alfa,beta,gama}".
请查看http://erlang.org/doc/getting_started/record_macros.html#id66845,请...
归档时间: |
|
查看次数: |
545 次 |
最近记录: |