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