`@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
在 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