在std Elixir软件包中,有很多行
@type t :: %__MODULE__{}
我知道@type
注解用于对注解中的类型的简短表示法进行别名化@spec
,但是此行用于uri.ex之类的模块中,这些模块根本没有@spec
注解。
此注释的目的是什么?
首先,默认情况下,使用@type
伪指令指定的类型是公共的(与用定义的类型相反@typep
)。这意味着即使模块中没有任何规范,定义类型也可以使其他开发人员在编写函数时使用该类型:
@doc "Computes the length of a URI."
@spec foo(URI.t) :: non_neg_integer
def foo(uri), do: # ...
__MODULE__
是一种特殊形式,可以作为原子扩展为当前模块名称(请参见docs),因此:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句