Прежде всего, типы, указанные с @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
Об этом '@ typep' и' @ type'. Что означает '@ opaque' чем? Я думал, что это тип, который является приватным –
@KrzysztofWende '@ opaque' типы являются общедоступными, но они не раскрывают внутреннюю структуру типа (например, поля в структуре не являются общедоступными, но тип' t 'структуры Типы '@ typep' полностью закрыты. Имеет ли смысл? – whatyouhide
Это делает. Частично. Зачем использовать тип, который можно использовать, но не внутренне проверяемый. –