在Elixir中的defstruct中使用@type指令。未对该字段执行运行时类型检查

在Elixir中的defstruct中使用@type指令。未对该字段执行运行时类型检查,elixir,Elixir,我理解如何使用@type指令定义用户定义的类型。到目前为止,我只在函数规范中见过它的用法。我很想知道它的使用是否可以扩展到结构,使参数和数据类型之间紧密耦合 我开始用一个示例程序进行探索 iex(1)> defmodule Result do ...(1)> @type t ::%__MODULE__{ status: String.t, value: integer} ...(1)> defstruct status: "OK", value: 100 ...(1)&

我理解如何使用@type指令定义用户定义的类型。到目前为止,我只在函数规范中见过它的用法。我很想知道它的使用是否可以扩展到结构,使参数和数据类型之间紧密耦合

我开始用一个示例程序进行探索

iex(1)> defmodule Result do
...(1)>   @type t ::%__MODULE__{ status: String.t, value: integer}
...(1)>   defstruct status: "OK", value: 100
...(1)> end
我在这里的理解是,结果是一个结构,状态字段是字符串,值字段是整数

iex(2)> %Result{}      
%Result{status: "OK", value: 100}
然而,令我惊讶的是,当我尝试输入不同的数据类型时,编译器并没有抛出任何类型的错误,并且对输入数据感到满意

iex(3)>res = %Result{status: 555, value: "blahblah"}
%Result{status: 555, value: "blahblah"}
文档建议为结构定义类型。但当它打开一个错误窗口时,我看不透这一点。
你能分享一下你的想法吗

恐怕您对字体规格的用途感到困惑

Elixir是一种动态类型语言,因此编译器不会真正检查类型规范。这就是erlang文档关于这些的用法所说的:

类型信息可用于以下方面:

  • 记录功能接口
  • 为缺陷检测工具(如透析器)提供更多信息
  • 由文档工具(如EDoc)利用,以生成各种形式的程序文档
因此,如果您使用
透析器
,它可能会抱怨到处传递spec invalid struct