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.