“@type t ::%__ MODULE __ {}”在Elixir中意味着什么

时间:2015-04-30 21:08:35

标签: elixir

在std Elixir包中有很多行,比如

@type t :: %__MODULE__{}

我知道@type注释用于在@spec注释中使用短的符号表示法,但这一行用于uri.ex等没有@spec的模块中根本没有注释。

此注释的目的是什么?

1 个答案:

答案 0 :(得分:26)

首先,默认情况下,使用@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