Elixir - moduły
W Elixirze kilka funkcji grupujemy w moduły. W poprzednich rozdziałach używaliśmy już różnych modułów, takich jak moduł String, moduł Bitwise, moduł Tuple itp.
Do tworzenia własnych modułów w Elixirze używamy rozszerzenia defmodulemakro. Używamydef makro do definiowania funkcji w tym module -
defmodule Math do
def sum(a, b) do
a + b
end
end
W następnych sekcjach nasze przykłady staną się dłuższe i wpisanie ich wszystkich w powłoce może być trudne. Musimy się nauczyć, jak kompilować kod Elixir, a także jak uruchamiać skrypty Elixir.
Kompilacja
Zawsze wygodnie jest zapisywać moduły do plików, aby można je było skompilować i ponownie wykorzystać. Załóżmy, że mamy plik o nazwie math.ex z następującą zawartością -
defmodule Math do
def sum(a, b) do
a + b
end
end
Pliki możemy skompilować za pomocą polecenia -elixirc :
$ elixirc math.ex
Spowoduje to wygenerowanie pliku o nazwie Elixir.Math.beamzawierający kod bajtowy zdefiniowanego modułu. Jeśli zaczniemyiexponownie, nasza definicja modułu będzie dostępna (pod warunkiem, że iex jest uruchomiony w tym samym katalogu, w którym znajduje się plik kodu bajtowego). Na przykład,
IO.puts(Math.sum(1, 2))
Powyższy program wygeneruje następujący wynik -
3
Tryb skryptowy
Oprócz rozszerzenia pliku Elixir .ex, Elixir obsługuje również .exspliki do obsługi skryptów. Elixir traktuje oba pliki dokładnie tak samo, jedyną różnicą jest cel..ex pliki są przeznaczone do kompilacji, podczas gdy pliki .exs są używane do scripting. Po uruchomieniu oba rozszerzenia kompilują się i ładują swoje moduły do pamięci, chociaż tylko.ex Pliki zapisują swój kod bajtowy na dysku w formacie plików .beam.
Na przykład, jeśli chcemy uruchomić Math.sum w tym samym pliku możemy użyć .exs w następujący sposób -
Math.exs
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(1, 2))
Możemy go uruchomić za pomocą polecenia Elixir -
$ elixir math.exs
Powyższy program wygeneruje następujący wynik -
3
Plik zostanie skompilowany w pamięci i wykonany, wypisując jako wynik „3”. Nie zostanie utworzony żaden plik kodu bajtowego.
Zagnieżdżanie modułów
Moduły można zagnieżdżać w Elixirze. Ta cecha języka pomaga nam lepiej organizować nasz kod. Aby utworzyć zagnieżdżone moduły, używamy następującej składni -
defmodule Foo do
#Foo module code here
defmodule Bar do
#Bar module code here
end
end
Powyższy przykład zdefiniuje dwa moduły: Foo i Foo.Bar. Do drugiego można uzyskać dostęp jakoBar wewnątrz Fooo ile mieszczą się w tym samym zakresie leksykalnym. Jeśli późniejBar moduł jest przenoszony poza definicję modułu Foo, musi się do niego odwoływać pełna nazwa (Foo.Bar) lub alias musi być ustawiony przy użyciu dyrektywy alias omówionej w rozdziale o aliasach.
Note- W Elixirze nie ma potrzeby definiowania modułu Foo w celu zdefiniowania modułu Foo.Bar, ponieważ język tłumaczy wszystkie nazwy modułów na atomy. Możesz zdefiniować dowolnie poszukiwane moduły bez definiowania żadnego modułu w łańcuchu. Na przykład możesz zdefiniowaćFoo.Bar.Baz bez definiowania Foo lub Foo.Bar.