тип против непрозрачных директив в эрланге - PullRequest
8 голосов
/ 22 февраля 2012

В чем разница между -opaque и -type? Я видел оба в основных модулях Erlang, но не чувствую разницу. Можно ли использовать -export_type для них обоих?

1 Ответ

8 голосов
/ 22 февраля 2012
%% module1.erl
-export_type([my_tup1/0, my_tup2/0]).
-type my_tup1() :: {any(), any()}.
-opaque my_tup2() :: {any(), any()}.

%% module2.erl
-spec foo1(module1:my_tup1()) -> ok.
foo1({_, _}) -> ok. %% fine

-spec foo2(module1:my_tup2()) -> ok.
foo2({_, _}) -> ok. 
%% Dialyzer warning, because you are looking at 
%% the internal structure of a my_tup2() term.
%% If you defined the same function in the module module1, it wouldn't give a warning.

foo2(_) -> ok. %% no warning again.

Да, вы можете экспортировать оба, и если вы не экспортируете их, нет никакой разницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...