Elixir - 型別規範



Elixir 是一種動態型別語言,因此 Elixir 中的所有型別都由執行時推斷。儘管如此,Elixir 還是提供了型別規範,型別規範是一種用於**宣告自定義資料型別和宣告型別化函式簽名(規範)**的表示法。

函式規範(specs)

預設情況下,Elixir 提供了一些基本型別,例如整數或 pid,以及複雜型別:例如,**round** 函式,它將浮點數四捨五入到最接近的整數,它接受一個數字作為引數(整數或浮點數)並返回一個整數。在相關的文件中,round 的型別簽名寫成如下形式:

round(number) :: integer

以上描述意味著左側的函式接受括號中指定的引數,並返回 :: 右側的內容,即 Integer。函式規範使用**@spec** 指令編寫,放置在函式定義的正前方。round 函式可以寫成如下形式:

@spec round(number) :: integer
def round(number), do: # Function implementation
...

型別規範也支援複雜型別,例如,如果要返回一個整數列表,則可以使用**[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?

**注意** - 透過 @type 定義的自定義型別會被匯出,並在定義它們的模組外部可用。如果要將自定義型別保持為私有,可以使用**@typep** 指令代替**@type**。

廣告