Elixir - 函式



函式是一組組織在一起以執行特定任務的語句。程式設計中的函式大多類似於數學中的函式。你給函式一些輸入,它們根據提供的輸入生成輸出。

Elixir 中有兩種型別的函式:

匿名函式

使用fn..end 結構定義的函式是匿名函式。這些函式有時也稱為 lambda 表示式。它們透過將它們賦值給變數名來使用。

命名函式

使用def 關鍵字定義的函式是命名函式。這些是 Elixir 中提供的原生函式。

匿名函式

顧名思義,匿名函式沒有名稱。這些函式經常傳遞給其他函式。要在 Elixir 中定義匿名函式,我們需要fnend關鍵字。在這些關鍵字內,我們可以定義任意數量的引數和函式體,用->分隔。例如:

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
廣告