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

时间:2016-07-27 15:18:02

标签: elixir

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

我开始使用示例程序进行探索。

iex(1)> defmodule Result do
...(1)>   @type t ::%__MODULE__{ status: String.t, value: integer}
...(1)>   defstruct status: "OK", value: 100
...(1)> end

我的理解是Result是一个结构,其中status字段是一个字符串,value字段是一个整数。

iex(2)> %Result{}      
%Result{status: "OK", value: 100}

然而,当我尝试使用不同的数据类型时,令我惊讶的是,编译器没有抛出任何类型的错误,并对输入数据感到满意。

iex(3)>res = %Result{status: 555, value: "blahblah"}
%Result{status: 555, value: "blahblah"}

文档建议定义结构的类型。但是,当它打开一个错误的窗口时,我不明白这一点。 能否请您分享您对此的看法。

1 个答案:

答案 0 :(得分:3)

我担心你对使用什么类型的规格感到困惑。

Elixir是一种动态类型语言,因此编译器并不真正检查typespecs。这是erlang docs对这些用法的说法:

  

类型信息可用于以下内容:

     
      
  • 记录功能接口
  •   
  • 提供有关错误检测工具的更多信息,例如Dialyzer
  •   
  • 被EDoc等文档工具利用,用于生成各种形式的程序文档
  •   

因此,如果您使用Dialyzer,它可能会抱怨传递规范无效的结构。