【问题标题】:What does `@type t :: %__MODULE__{}` mean in ElixirElixir 中的 `@type t :: %__MODULE__{}` 是什么意思
【发布时间】:2015-07-10 17:57:45
【问题描述】:

在 std Elixir 包中有很多类似的行

@type t :: %__MODULE__{}

我知道@type 注释用于别名在@spec 注释中的类型的短符号,但是这一行用于诸如uri.ex 之类的模块中,它根本没有@spec 注释。

这个注解的目的是什么?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    首先,使用@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 比是什么意思?我认为这是一种私有的类型
    • @KrzysztofWende @opaque 类型是公开的,但它们不显示类型的内部结构(例如,结构中的字段不是公开的,但结构的 t 类型是公开的。 @typep 类型是完全私有的。有意义吗?
    • 确实如此。部分。为什么要使类型可用但内部不可检查
    • @KrzysztofWende 也许您想隐藏类型的复杂性,但仍要在公共 API 中公开类型?
    • @Tilo 是的,-90..90 在这种情况下是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2021-11-16
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多