我理解@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"}
文档建议定义结构的类型。但是,当它打开一个错误的窗口时,我不明白这一点。 能否请您分享您对此的看法。
答案 0 :(得分:3)
我担心你对使用什么类型的规格感到困惑。
Elixir是一种动态类型语言,因此编译器并不真正检查typespecs。这是erlang docs对这些用法的说法:
类型信息可用于以下内容:
- 记录功能接口
- 提供有关错误检测工具的更多信息,例如Dialyzer
- 被EDoc等文档工具利用,用于生成各种形式的程序文档
因此,如果您使用Dialyzer
,它可能会抱怨传递规范无效的结构。