Typespecs( Typespecs)
优质
小牛编辑
137浏览
2023-12-01
Elixir是一种动态类型语言,因此Elixir中的所有类型都是由运行时推断的。 尽管如此,Elixir还带有typespecs,这是一种用于declaring custom data types and declaring typed function signatures (specifications) 。
Function Specifications(specs)
默认情况下,Elixir提供了一些基本类型,例如integer或pid,以及复杂类型:例如, round函数将float转换为其最接近的整数,将一个数字作为参数(整数或浮点数)和返回一个整数。 在相关documentation ,圆形类型签名写为 -
round(number) :: integer
上面的描述暗示左边的函数作为参数在括号中指定,并返回::,即Integer右边的内容。 函数规范使用@spec指令编写,放在函数定义之前。 圆函数可写为 -
@spec round(number) :: integer
def round(number), do: # Function implementation
...
Typespecs也支持复杂类型,例如,如果要返回整数列表,则可以使用[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?
NOTE - 通过@type定义的自定义类型将被导出,并在定义它们的模块之外可用。如果要将自定义类型保持为私有,则可以使用@typep指令而不是@type 。