Elixir 自定義類(lèi)型

2023-12-16 20:47 更新
Elixir提供了一些有用的內(nèi)置類(lèi)型,但自定義合適的類(lè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

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

我們可以這樣定義函數(shù)規(guī)格,但是一直重復(fù){number, String.t}很煩人.我們可以使用@type指令來(lái)聲明我們自定義的類(lèi)型.

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指令類(lèi)似于@doc@moudledoc指令,用于注釋自定義類(lèi)型.

通過(guò)@type定義的類(lèi)型可以被導(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

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


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)