在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)