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ń.