Elixir 自定义类型

2023-12-16 20:47 更新
Elixir提供了一些有用的内置类型,但自定义合适的类型也很方便.方法是在定义模块时使用@type指令.

假设我们有一个LousyCalculator模块,它能进行普通的算术操作(求和,乘积等等),但是,它返回的不是一个数,而是一个元组,第一个元素是计算结果,第二个元素是随机的评论.

defmodule LousyCalculator do
  @spec add(number, number) :: {number, String.t}
  def add(x, y), do: {x + y, "You need a calculator to do that?!"}

  @spec multiply(number, number) :: {number, String.t}
  def multiply(x, y), do: {x * y, "Jeez, come on!"}
end

如你所见,元组是复合类型,每个元组是通过其中的类型来区分的.想知道为什么String.t不写作string,请查看类型规格中的标记文档.

我们可以这样定义函数规格,但是一直重复{number, String.t}很烦人.我们可以使用@type指令来声明我们自定义的类型.

defmodule LousyCalculator do
  @typedoc """
  Just a number followed by a string.
  """
  @type number_with_remark :: {number, String.t}

  @spec add(number, number) :: number_with_remark
  def add(x, y), do: {x + y, "You need a calculator to do that?"}

  @spec multiply(number, number) :: number_with_remark
  def multiply(x, y), do: {x * y, "It is like addition on steroids."}
end

@typedoc指令类似于@doc@moudledoc指令,用于注释自定义类型.

通过@type定义的类型可以被导出并在定义模块之外使用:

defmodule QuietCalculator do
  @spec add(number, number) :: number
  def add(x, y), do: make_quiet(LousyCalculator.add(x, y))

  @spec make_quiet(LousyCalculator.number_with_remark) :: number
  defp make_quiet({num, _remark}), do: num
end

如果你想将自定义类型设为私有的,可以用@typep替代@type.


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号