我在Elixir文件中看到过这个:
@type t :: %__MODULE__{
var1: String.t,
var2: String.t,
var3: String.t,
var4: map,
var5: integer,
var6: list
}
这是什么,它是什么以及它做了什么?
答案 0 :(得分:1)
这是什么
确实是类型规范或“typespec”。它定义了一个以当前模块命名的类型,并指定该类型是包含三个字符串(基于二进制的Elixir类型,而不是基于字符串的Erlang类型),一个映射,一个整数和一个列表的结构。
它是什么,它做了什么?
Erlang和Elixir通常是动态语言,几乎没有类型的攻击方式;虽然可以定义接受特定类型参数的函数(例如通过使用保护和/或“模式匹配”),但它并不像Java那样严格。
然而,Erlang生态系统有各种工具(最值得注意的是,一种称为Dialyzer),能够检测不匹配类型和其他常见错误原因。 Dialyzer能够推断函数应该接受哪些类型的参数的方法之一是程序员用类型约束来注释一个函数的签名和模块;这样,如果有任何可能违反这些约束的函数调用,Dialyzer可以接受它并对程序员大喊大叫以修复一个代码。
与此同时,文档系统可以使用这些相同类型的注释作为函数/ API文档的一部分,立即向读取该文档的任何人发出信号,告知参数类型的参数类型以及返回值的预期类型。
这一切都是通过向模块添加属性在Erlang / Elixir方面完成的; @type
属性创建一个新的类型规范,@spec
属性可以使用这些类型规范来指示期望哪些类型作为参数或由函数返回。这些在运行时或编译时并不会真正影响代码,但它们在记录函数或静态检查代码时会有所帮助。
Elixir的入门指南有一个pretty decent primer on how to use typespecs in one's code。