W zeszłym tygodniu się nie udało, to mam nadzieję, że w tym się uda. Jak zawsze, coś dochodzi do artykułów o elixir, o czym nie pomyślałem wcześniej. By móc opisać use
, muszę opisać require
a skoro już to robię to też warto wspomnieć o import
i alias
.
Więc postaram się krótko opowiedzieć o tych trzech dyrektywach i jak mi czasu starczy to i o use
. Zaczynajmy.
alias
alias
umożliwia nam skrócenie tekstu jaki musimy napisać by odwołać się do danego modułu. Ogólnie z tym nie ma problemu ale jeżeli mamy cały czas pisać długie nazwy to po prostu kod zaczyna brzydko wyglądać – i bez intellisense pisanie ich jest idealnym miejscem do wprowadzania błędów, literówek. Dlatego też, pod deklaracją metody czy modułu (alias
ma zasięg danego do/end
) możemy dodać polecenie:
alias Some.Long.ModuleName.CozICan, as: Coz
I teraz zamiast pisać wszędzie:
Some.Long.ModuleName.CozICan.jump
Możemy napisać:
Coz.jump
Czyli alias
tutaj zadziałał następująco: naszą długą nazwę zamienił na (as:
) nazwę podaną przez nas. Jeżeli jednak nazwa CozICan
nam odpowiada, to wystarczy, że napiszemy:
alias Some.Long.ModuleName.CozICan
I CozICan.jump
będzie dla nas dostępne. Dzieje się tak, gdyż alias
domyślnie przyjmuje nazwę modułu jako as:
.
import
import
nie robi nic innego, tylko importuje wszystkie funkcje z danego modułu do naszego, przez co, nie musimy w ogóle pisać żadnych modułów by się do nich dostać
defmodule MyList do import List end
Teraz wszędzie gdzie potrzebujemy w module MyList
możemy się odwoływać do metod typu delete/2
jakby to były nasze własne lokalne metody. Podobnie jak alias
, import
jest ograniczony do zasięgu do/end
– czyli może być na przykład stosowany per metoda.
Dodatkowo, możemy importować tylko niektóre z metod – na przykład z modułu List
będziemy korzystać jedynie z delete/2
:
import List, only:[ delete: 2]
Jeżeli następuje konflikt nazw, my mamy metodę delete/2
i List ma. To do delete/2
z List
możemy się odwołac poprzez pełną nazwę: Elixir.List.delete
.
require
Jeżeli w kodzie wywołujemy makro (funkcję która wygląda jak funkcja ale jest makrem defmacro
), wtedy musimy załadować moduł, który to makro definiuje. Jest to spowodowane tym, że makra są ładowane i wykonywane w trakcie kompilacji. Dla przykładu, moduł Integer
implementuje dwa makra, is_odd
i is_even
. By móc z nich skorzystać, moduł Integer
musi zostać załadowany. Możemy zrobić tak, że zaimportujemy wszystkie jego metody do nas lokalnie za pomocą import
. Lub po prostu zainicjalizujemy moduł Integer
za pomocą require
. Z tą różnicą, iż by odwołać się do metody będziemy musieli podać pełną nazwę funkcji wraz z modułem:
require Integer Integer.is_odd(3)
vs:
import Integer is_odd(3)
Podsumowanie
Dobra, czas mi się skończył. use
przechodzi na następny tydzień :( Dziś było prosto, ale te metody ułatwią nam pisanie w większych projektach jak i upiększą nasz kod. Z alias
już nie raz korzystałem, z import
jeszcze nie musiałem. Zaś z require
“nieświadomie” korzystałem, ale o tym za tydzień.