Elixir - Funkcje

Funkcja to zestaw instrukcji zorganizowanych razem w celu wykonania określonego zadania. Funkcje w programowaniu działają głównie jak funkcja w matematyce. Dajesz funkcjom pewne dane wejściowe, generują one dane wyjściowe na podstawie dostarczonych danych wejściowych.

W Elixirze istnieją 2 rodzaje funkcji -

Funkcja anonimowa

Funkcje zdefiniowane przy użyciu fn..end constructsą funkcjami anonimowymi. Te funkcje są czasami nazywane również lambdami. Są używane poprzez przypisanie ich do nazw zmiennych.

Nazwana funkcja

Funkcje zdefiniowane przy użyciu def keywordto nazwane funkcje. Są to natywne funkcje dostępne w Elixirze.

Funkcje anonimowe

Jak sama nazwa wskazuje, anonimowa funkcja nie ma nazwy. Często są one przekazywane do innych funkcji. Aby zdefiniować anonimową funkcję w Elixirze, potrzebujemy rozszerzeniafn i endsłowa kluczowe. W ramach tych możemy zdefiniować dowolną liczbę parametrów i treści funkcji oddzielonych->. Na przykład,

sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))

Po uruchomieniu powyższego programu, jest uruchamiany, generuje następujący wynik -

6

Zauważ, że te funkcje nie są nazywane jak nazwane funkcje. Mamy '.'między nazwą funkcji a jej argumentami.

Korzystanie z operatora przechwytywania

Możemy również zdefiniować te funkcje za pomocą operatora przechwytywania. Jest to łatwiejsza metoda tworzenia funkcji. Zdefiniujemy teraz powyższą funkcję sumy za pomocą operatora przechwytywania,

sum = &(&1 + &2) 
IO.puts(sum.(1, 2))

Po uruchomieniu powyższego programu generuje następujący wynik -

3

W wersji skróconej nasze parametry nie są nazwane, ale są dostępne dla nas jako & 1, & 2, & 3 i tak dalej.

Funkcje dopasowania wzorców

Dopasowywanie wzorców nie ogranicza się tylko do zmiennych i struktur danych. Możemy użyć dopasowania wzorców, aby nasze funkcje były polimorficzne. Na przykład zadeklarujemy funkcję, która może pobierać 1 lub 2 wejścia (w krotce) i wypisywać je na konsoli,

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"})

Uruchomienie powyższego programu daje następujący wynik -

Hey people found in a tuple!
Hello and World found!

Nazwane funkcje

Możemy zdefiniować funkcje z nazwami, abyśmy mogli łatwo odwołać się do nich później. Nazwane funkcje są definiowane w module za pomocą słowa kluczowego def. Nazwane funkcje są zawsze definiowane w module. Aby wywołać nazwane funkcje, musimy odwołać się do nich za pomocą nazwy modułu.

Poniżej przedstawiono składnię nazwanych funkcji -

def function_name(argument_1, argument_2) do
   #code to be executed when function is called
end

Zdefiniujmy teraz naszą nazwaną sumę funkcji w module Math.

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

IO.puts(Math.sum(5, 6))

Uruchomienie powyższego programu daje następujący wynik -

11

W przypadku funkcji 1-liniowych istnieje skrótowa notacja definiująca te funkcje za pomocą do:. Na przykład -

defmodule Math do
   def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))

Uruchomienie powyższego programu daje następujący wynik -

11

Funkcje prywatne

Elixir daje nam możliwość definiowania prywatnych funkcji, do których można uzyskać dostęp z poziomu modułu, w którym zostały zdefiniowane. Aby zdefiniować funkcję prywatną, użyjdefp zamiast def. Na przykład,

defmodule Greeter do
   def hello(name), do: phrase <> name
   defp phrase, do: "Hello "
end

Greeter.hello("world")

Uruchomienie powyższego programu daje następujący wynik -

Hello world

Ale jeśli po prostu spróbujemy jawnie wywołać funkcję frazy, używając Greeter.phrase() funkcji, spowoduje to błąd.

Domyślne argumenty

Jeśli zależy nam na domyślnej wartości argumentu, używamy rozszerzenia argument \\ value składnia -

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")

Uruchomienie powyższego programu daje następujący wynik -

Hello, Ayush
Hello, Ayush
Hola, Ayush