当前位置: 首页 > 文档资料 > Elixir 中文教程 >

Typespecs( Typespecs)

优质
小牛编辑
132浏览
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