
- Elixir 教程
- Elixir - 首頁
- Elixir - 概述
- Elixir - 環境
- Elixir - 基本語法
- Elixir - 資料型別
- Elixir - 變數
- Elixir - 運算子
- Elixir - 模式匹配
- Elixir - 決策
- Elixir - 字串
- Elixir - 字元列表
- Elixir - 列表和元組
- Elixir - 關鍵字列表
- Elixir - Map
- 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 中,我們將多個函式分組到模組中。我們已經在前面的章節中使用了不同的模組,例如 String 模組、Bitwise 模組、Tuple 模組等。
為了在 Elixir 中建立我們自己的模組,我們使用 `defmodule` 宏。我們使用 `def` 宏來定義該模組中的函式:
defmodule Math do def sum(a, b) do a + b end end
在接下來的章節中,我們的示例大小將越來越大,在 shell 中輸入所有內容可能會很麻煩。我們需要學習如何編譯 Elixir 程式碼以及如何執行 Elixir 指令碼。
編譯
將模組寫入檔案以便編譯和重用總是很方便的。假設我們有一個名為 math.ex 的檔案,其內容如下:
defmodule Math do def sum(a, b) do a + b end end
我們可以使用命令 `elixirc` 編譯這些檔案。
$ elixirc math.ex
這將生成一個名為 `Elixir.Math.beam` 的檔案,其中包含已定義模組的位元組碼。如果我們再次啟動 `iex`,我們的模組定義將可用(前提是 iex 在與位元組碼檔案相同的目錄中啟動)。例如:
IO.puts(Math.sum(1, 2))
上面的程式將生成以下結果:
3
指令碼模式
除了 Elixir 副檔名 `.ex` 之外,Elixir 還支援 `.exs` 檔案用於指令碼編寫。Elixir 對這兩個檔案處理方式完全相同,唯一的區別在於目標。`.ex` 檔案旨在進行編譯,而 `.exs` 檔案用於`指令碼編寫`。執行時,兩個副檔名都會編譯並將它們的模組載入到記憶體中,儘管只有 `.ex` 檔案會將其位元組碼以 `.beam` 檔案的格式寫入磁碟。
例如,如果我們想在同一檔案中執行 `Math.sum`,我們可以使用 `.exs` 檔案,如下所示:
Math.exs
defmodule Math do def sum(a, b) do a + b end end IO.puts(Math.sum(1, 2))
我們可以使用 Elixir 命令執行它:
$ elixir math.exs
上面的程式將生成以下結果:
3
該檔案將在記憶體中編譯並執行,列印“3”作為結果。不會建立位元組碼檔案。
模組巢狀
模組可以在 Elixir 中巢狀。此語言特性有助於我們更好地組織程式碼。要建立巢狀模組,我們使用以下語法:
defmodule Foo do #Foo module code here defmodule Bar do #Bar module code here end end
上面給出的示例將定義兩個模組:`Foo` 和 `Foo.Bar`。只要它們在相同的詞法作用域中,第二個模組可以在 `Foo` 模組內訪問為 `Bar`。如果稍後將 `Bar` 模組移到 `Foo` 模組定義之外,則必須使用其全名 (Foo.Bar) 引用它,或者必須使用在別名章節中討論的 alias 指令設定別名。
注意 - 在 Elixir 中,不需要定義 Foo 模組來定義 Foo.Bar 模組,因為該語言將所有模組名稱轉換為原子。您可以定義任意巢狀的模組,而無需定義鏈中的任何模組。例如,您可以定義 `Foo.Bar.Baz` 而無需定義 `Foo` 或 `Foo.Bar`。