【发布时间】:2015-07-10 17:57:45
【问题描述】:
在 std Elixir 包中有很多类似的行
@type t :: %__MODULE__{}
我知道@type 注释用于别名在@spec 注释中的类型的短符号,但是这一行用于诸如uri.ex 之类的模块中,它根本没有@spec 注释。
这个注解的目的是什么?
【问题讨论】:
标签: elixir
在 std Elixir 包中有很多类似的行
@type t :: %__MODULE__{}
我知道@type 注释用于别名在@spec 注释中的类型的短符号,但是这一行用于诸如uri.ex 之类的模块中,它根本没有@spec 注释。
这个注解的目的是什么?
【问题讨论】:
标签: elixir
首先,使用@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
【讨论】:
@typep 和@type。 @opaque 比是什么意思?我认为这是一种私有的类型
@opaque 类型是公开的,但它们不显示类型的内部结构(例如,结构中的字段不是公开的,但结构的 t 类型是公开的。 @typep 类型是完全私有的。有意义吗?
-90..90 在这种情况下是你想要的。