在std Elixir包中有很多行,比如
@type t :: %__MODULE__{}
我知道@type
注释用于在@spec
注释中使用短的符号表示法,但这一行用于uri.ex等没有@spec
的模块中根本没有注释。
此注释的目的是什么?
答案 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