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`。

廣告