
- 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 中有兩種型別的函式:
匿名函式
使用fn..end 結構定義的函式是匿名函式。這些函式有時也稱為 lambda 表示式。它們透過將它們賦值給變數名來使用。
命名函式
使用def 關鍵字定義的函式是命名函式。這些是 Elixir 中提供的原生函式。
匿名函式
顧名思義,匿名函式沒有名稱。這些函式經常傳遞給其他函式。要在 Elixir 中定義匿名函式,我們需要fn和end關鍵字。在這些關鍵字內,我們可以定義任意數量的引數和函式體,用->分隔。例如:
sum = fn (a, b) -> a + b end IO.puts(sum.(1, 5))
執行上述程式時,會生成以下結果:
6
請注意,這些函式的呼叫方式與命名函式不同。函式名和引數之間有一個“.”。
使用捕獲運算子
我們還可以使用捕獲運算子來定義這些函式。這是一種建立函式的更簡單方法。我們現在將使用捕獲運算子來定義上述 sum 函式:
sum = &(&1 + &2) IO.puts(sum.(1, 2))
執行上述程式時,會生成以下結果:
3
在簡寫版本中,我們的引數沒有命名,但我們可以將其作為 &1、&2、&3 等使用。
模式匹配函式
模式匹配不僅限於變數和資料結構。我們可以使用模式匹配使我們的函式多型。例如,我們將宣告一個函式,它可以接受 1 個或 2 個輸入(在元組中)並將它們列印到控制檯:
handle_result = fn {var1} -> IO.puts("#{var1} found in a tuple!") {var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!") end handle_result.({"Hey people"}) handle_result.({"Hello", "World"})
執行上述程式時,會產生以下結果:
Hey people found in a tuple! Hello and World found!
命名函式
我們可以定義帶名稱的函式,以便以後可以輕鬆引用它們。命名函式在模組中使用 def 關鍵字定義。命名函式始終在模組中定義。要呼叫命名函式,我們需要使用其模組名來引用它們。
以下是命名函式的語法:
def function_name(argument_1, argument_2) do #code to be executed when function is called end
現在讓我們在 Math 模組中定義我們的命名函式 sum。
defmodule Math do def sum(a, b) do a + b end end IO.puts(Math.sum(5, 6))
執行上述程式時,會產生以下結果:
11
對於單行函式,有一種簡寫表示法來定義這些函式,使用do:。例如:
defmodule Math do def sum(a, b), do: a + b end IO.puts(Math.sum(5, 6))
執行上述程式時,會產生以下結果:
11
私有函式
Elixir 使我們可以定義私有函式,這些函式可以從定義它們的模組內部訪問。要定義私有函式,請使用defp代替def。例如:
defmodule Greeter do def hello(name), do: phrase <> name defp phrase, do: "Hello " end Greeter.hello("world")
執行上述程式時,會產生以下結果:
Hello world
但是,如果我們只是嘗試使用Greeter.phrase()函式顯式呼叫 phrase 函式,它將引發錯誤。
預設引數
如果我們想要引數的預設值,我們使用引數 \\ 值語法:
defmodule Greeter do def hello(name, country \\ "en") do phrase(country) <> name end defp phrase("en"), do: "Hello, " defp phrase("es"), do: "Hola, " end Greeter.hello("Ayush", "en") Greeter.hello("Ayush") Greeter.hello("Ayush", "es")
執行上述程式時,會產生以下結果:
Hello, Ayush Hello, Ayush Hola, Ayush