Ostatni tydzień był łaskawy i na Elixir udało mi się poświęcić więcej niż 2h – głównie czytania, ale zawsze coś. Dzięki temu kilka spraw mi się rozjaśniło :) co jest to dość dobre szczere mówiąc :) Więc tym razem zamiast kodu – choć trochę go będzie – więcej raczej informacji typu FAQ ;)
Zwracanie wartośći
Dziwiło mnie to, że wystarczy iż w metodzie napiszę:
def sum(a, b) do a + b end
I już wiadomo, że chcę zwrócić wartość. W Elixir, każde wyrażenie! Powtórzę KAŻDE zwraca wartość, nawet if
. Ciekwe, ale też ma to ręce i nogi. Takie podejście sprawuje się idelnie przy łączeniu wyrażeń za pomocą operatora pipeline |>
ale o nim jeszcze będzie osobny post.
Pliki i moduły
To mnie ciekawiło. Ostatnio stworzyłem osobny plik dla Euclid.Contract.
Bo sądziłem, że tak trzeba. Okazuje się, że nie. Po pierwsze, może być wiele modułów w pliku – super. Po drugie, można zagnieżdżać modułu. Po trzecie przez przypadek zastosowałem domyślny sposób “namespacingu” w Elixir.
Opcja pierwsza:
defmodule Euclid.Contract end defmodule Euclid @behaviour Euclid.Contract end
Opcja druga:
defmodule Euclid defmodule Impl @behaviour Contract end defmodule Contract end end
Opcja trzecia, tak zwany namespace. Nie ma w Elixir czegoś takiego jak hierarchia. Wszystko jest uzależnione od tego jak nazwiesz moduł lub czy jest on zagnieżdżony. Więc dzięki kropce możesz stworzyć sobie pseudo namespace – dla Twojego oka to tak może wyglądać, dla elixr nie ma znaczenia, każdy moduł jest “odgórny” ;)
Lokalizacja funkcji
Funkcje mogą być tylko i wyłącznie w modułach. To się potwierdza z tym co czytałem wcześniej, z komentarzami i moimi eksperymentami.
Elixirowe nazewnictwo funkcji
Czasami możecie zobaczyć na przykład taki string:
COŚ/2 INNE_COS/1 JESZCZE_INNE_COS/0
Czy też bardziej realne:
List.insert_at/3
Co to oznacza? Co znaczy /LICZBA
? A mianowicie, liczbę parametrów ;) to jest tak banalne, że aż mi się smutno zrobiło, że się nie domyśliłem :)
Przeciążanie funkcji
Ok, .NETowcy, ile razy pisaliście kod typu:
public smth Do(string a) { return Do(a, null, null, 10); } // [...] public smth Do(string a, string b, string c, int priority) { }
Każdy z was? Haha :) no i dobrze! Bo się nie dało lepiej przez wiele lat ;) a tutaj się da (domyślnie):
def do (a, b \\ nil, c \\ nil, priority \\ 10) do end
Dla prostego przykładu zróbcie sobie dodawanie ;) będzie łatwiej:
defmodule Test_sum do def add(a \\ 1, b \\ 1, c \\ 1, d \\ 1) do a+b+c+d end end
Wyrażenie \\
umożliwia ustawienie domyślnej wartości dla argumentu. By to przetestować kod powyżej wklejcie do iex
lub za pomocą mix
stwórzcie nowy projekt i odpalcie iex -S mix
:
Test_sum.add Test_sum.add (2) Test_sum.add (2, 2) Test_sum.add (2, 2, 2) Test_sum.add (2, 2, 2, 2) Test_sum.add (2, "aa")
A co z nawiasami?
No zostawiłem to prawie na koniec pisząc wszędzie te nawiasy jak bozia przykazała. A no właśnie nie w elixirze. Jest to kompletnie opcjonalne. Czyli powyższy przypadek wywołania można zapisać:
Test_sum.add 2, 2, 2
A definicję:
def add a \\ 1, b \\ 1, c \\ 1, d \\ 1 do
Dla przejrzystości jednak warto dodawać chyba te nawiasy. Zobaczę, już się dziś łapałem pisząc posta, i je pomijałem ;) więc zobaczymy.
Konwencja nazywania funkcji
A to było dość ciekawe, po pierwsze, że w ogóle to robią i w jakim celu. Mianowicie programiści Elixir dodają do metod znak zapytania ?
lub wykrzyknik !
. Wszystko po to by rozróżnić metodę zwracającą true/false
i metodę wywołującą wyjątek.
Czyli z poprzedniego tygodnia add
i divide
powinny się nazywać add!
i divide!
. Zobaczę jak mi pójdzie dostosowanie się do tego :)
Do tego dochodzi jeszcze zastada raczej używania podkreślenia do rozdzielenia słów: validate_input_against_params
zamist validateInputAgainstParams
, przy czym ValidateInputAgainsParams
jest nie dozwolone gdyż nazwa musi zaczynać się od małej literki lub podkreślenia.
W czym jest napisany Elixir?
I to mnie chyba najbardziej zadziwiło. Do tej pory myślałem, że Elixir to język w oparciu o wirtualną maszynę Erlanga – czyli jest napisany w Erlangu. Jak się okazuje, myliłem się – no prawie. Bardzo mała część jest napisana w Erlangu, prawie, że nic. Reszta jest napisana w Elixir :) większość Elixir jest napisana w Elixir co jest dość takie ŁOŁ. Jak to było możliwe? To będę chciał poruszyć w kolejnym poscie. Ale aż mnie rączki świerzbią by nie czekać tygodnia i zacząć eksperymentować TERAZ :)
Podsumowanie
Trochę mi te podstawy rozjaśniły w głowie. Zaczynam mieć bazę na której będę wstanie budować dalszą wiedzę. Wciąż mam kilka dziur i będę się je starał uzupełniać w miarę upływu czasu. Pewnie także dużo więcej teorii i praktyki związanej z Actor modelem by się tutaj przydało. Co zamierzam nadrobić. To może też pomoże w pełni zrozumieć dlaczego moduł istnieje i na jakiej zasadzie istnieje – choć mam wrażenie, że odp jest po stronie Erlanga a nie Elixira :) więc może uda się w kolejny poscie wkraść tą informację ;)
[…] Elixir #04 – Podstawy Q&A […]
Comments are closed.