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

Krz*_*nde 18 elixir

在std Elixir包中有很多行

@type t :: %__MODULE__{}
Run Code Online (Sandbox Code Playgroud)

我知道@type注释用于注释注释中类型的短符号@spec,但是这一行用于诸如uri.ex之类的模块中,它根本没有@spec注释.

这个注释的目的是什么?

wha*_*ide 29

首先,默认情况下,使用该@type指令指定的类型是公共的(与定义的类型相反@typep).这意味着即使模块中没有规范,定义类型也允许其他开发人员在编写函数时使用该类型:

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

__MODULE__是一个特殊的形式,它扩展为当前模块名称作为原子(请参阅文档),所以这:

defmodule MyModule do
  @type t :: %__MODULE__{}
end
Run Code Online (Sandbox Code Playgroud)

将定义一种MyModule.t类型.该t类型的最常见用途是表示结构和协议(例如Enum.t).这种模式非常常见:

defmodule User do
  defstruct [:name, :email]
  @type t :: %__MODULE__{name: String.t, email: String.t}
end
Run Code Online (Sandbox Code Playgroud)

  • @KrzysztofWende `@opaque` 类型是公共的,但它们不揭示类型的内部结构(例如,结构中的字段不是公共的,但结构的 `t` 类型是公共的。`@typep` 类型完全是公共的。私人的,这有意义吗? (2认同)