Elixir 自定義類型

2023-12-16 20:47 更新
Elixir提供了一些有用的內(nèi)置類型,但自定義合適的類型也很方便.方法是在定義模塊時(shí)使用@type指令.

假設(shè)我們有一個(gè)LousyCalculator模塊,它能進(jìn)行普通的算術(shù)操作(求和,乘積等等),但是,它返回的不是一個(gè)數(shù),而是一個(gè)元組,第一個(gè)元素是計(jì)算結(jié)果,第二個(gè)元素是隨機(jī)的評(píng)論.

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

如你所見,元組是復(fù)合類型,每個(gè)元組是通過其中的類型來區(qū)分的.想知道為什么String.t不寫作string,請(qǐng)查看類型規(guī)格中的標(biāo)記文檔.

我們可以這樣定義函數(shù)規(guī)格,但是一直重復(fù){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定義的類型可以被導(dǎo)出并在定義模塊之外使用:

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

如果你想將自定義類型設(shè)為私有的,可以用@typep替代@type.


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)