📅  最后修改于: 2020-11-04 05:33:59             🧑  作者: Mango
Elixir是一种动态类型化的语言,因此Elixir中的所有类型均由运行时推断。尽管如此,Elixir带有typespec,这是用于声明自定义数据类型和声明类型化的函数签名(规范)的一种表示法。
默认情况下,Elixir提供一些基本类型,例如整数或pid,以及复杂类型:例如, round函数将一个float舍入为最接近的整数,并使用数字作为参数(整数或float),并且返回一个整数。在相关文档中,舍入类型签名写为-
round(number) :: integer
上面的描述暗示着左侧的函数将括号中指定的内容作为参数,并返回::右侧的内容,即Integer。函数规范是使用@spec指令编写的,该指令位于函数定义之前。舍入函数可以写成-
@spec round(number) :: integer
def round(number), do: # Function implementation
...
Typespec也支持复杂类型,例如,如果要返回整数列表,则可以使用[Integer]
尽管Elixir提供了许多有用的内置类型,但在适当时定义自定义类型很方便。通过@type指令定义模块时可以完成此操作。让我们考虑一个例子来理解相同-
defmodule FunnyCalculator do
@type number_with_joke :: {number, String.t}
@spec add(number, number) :: number_with_joke
def add(x, y), do: {x + y, "You need a calculator to do that?"}
@spec multiply(number, number) :: number_with_joke
def multiply(x, y), do: {x * y, "It is like addition on steroids."}
end
{result, comment} = FunnyCalculator.add(10, 20)
IO.puts(result)
IO.puts(comment)
运行上述程序时,将产生以下结果-
30
You need a calculator to do that?
注–通过@type定义的自定义类型将被导出,并且可以在定义它们的模块之外使用。如果要将自定义类型保留为私有,则可以使用@typep指令而不是@type 。