2015-04-30 3 views
11

В станде Elixir пакетов Есть много линий, какЧто `@type т ::% __ МОДУЛЬ __ {}` означает в эликсире

@type t :: %__MODULE__{} 

Я знаю, что @type аннотаций используются для псевдонима короткой нотации введите @spec аннотации, но эта строка используется в таких модулях, как uri.ex, которая вообще не содержит аннотаций @spec.

Какова цель этой аннотации?

ответ

20

Прежде всего, типы, указанные с @type директивы являются общественности по умолчанию (в отличие от типов, определенных с @typep). Это означает, что даже если модуль не имеет функций в нем, определяя тип позволяет другие разработчикам использовать этот тип при написании своих функций:

@doc "Computes the length of a URI." 
@spec foo(URI.t) :: non_neg_integer 
def foo(uri), do: # ... 

__MODULE__ является специальной формой, которая расширяется имя текущего модуля в качестве атома (см docs for it), так что:

defmodule MyModule do 
    @type t :: %__MODULE__{} 
end 

будет определять MyModule.t тип. Наиболее распространенное использование типа t предназначено для представления структур и протоколов (например, Enum.t). Эта схема чрезвычайно распространена:

defmodule User do 
    defstruct [:name, :email] 
    @type t :: %__MODULE__{name: String.t, email: String.t} 
end 
+0

Об этом '@ typep' и' @ type'. Что означает '@ opaque' чем? Я думал, что это тип, который является приватным –

+1

@KrzysztofWende '@ opaque' типы являются общедоступными, но они не раскрывают внутреннюю структуру типа (например, поля в структуре не являются общедоступными, но тип' t 'структуры Типы '@ typep' полностью закрыты. Имеет ли смысл? – whatyouhide

+0

Это делает. Частично. Зачем использовать тип, который можно использовать, но не внутренне проверяемый. –

Смежные вопросы