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
.
以上内容是否对您有帮助:
更多建议: