- Elixir 教程
- Elixir - 首頁
- Elixir - 概述
- Elixir - 環境
- Elixir - 基本語法
- Elixir - 資料型別
- Elixir - 變數
- Elixir - 運算子
- Elixir - 模式匹配
- Elixir - 決策
- Elixir - 字串
- Elixir - 字元列表
- Elixir - 列表和元組
- Elixir - 關鍵字列表
- Elixir - 對映
- Elixir - 模組
- Elixir - 別名
- Elixir - 函式
- Elixir - 遞迴
- Elixir - 迴圈
- Elixir - 可列舉
- Elixir - 流
- Elixir - 結構體
- Elixir - 協議
- Elixir - 檔案 I/O
- Elixir - 程序
- Elixir - 符號
- Elixir - 推導式
- Elixir - 型別規範
- Elixir - 行為
- Elixir - 錯誤處理
- Elixir - 宏
- Elixir - 庫
- Elixir 有用資源
- Elixir - 快速指南
- Elixir - 有用資源
- Elixir - 討論
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**。
廣告