`@type t :: %__MODULE__{}` 在 Elixir 中是什么意思

What does `@type t :: %__MODULE__{}` mean in Elixir

在 std Elixir 包中有很多像

这样的行
@type t :: %__MODULE__{}

我知道 @type 注释用于在 @spec 注释中对类型的短符号进行别名,但这行用于 uri.ex 等没有 @spec 注释。

这个注释的目的是什么?

首先,@type指令指定的类型默认为public(与@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