“ @type t ::%__ MODULE __ {}”在Elixir中是什么意思

Krzysztof转

在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章