Po pierwsze ! i ?
Są to konwencje nazewnictwa stosowane zwykle do końca nazwy funkcji i są nie jakiejkolwiek specjalnej składni.
! - Podniesie wyjątek, jeśli funkcja napotka błąd.
Jednym z dobrych przykładów jest Enum.fetch! (Ma również ten sam Enum.fetch, który nie powoduje wyjątku) .Finduje element przy danym indeksie (oparty na zera). Podnosi OutOfBoundsError, jeśli podana pozycja znajduje się poza zakresem kolekcji.
? - Używany, aby pokazać, że funkcja zwróci wartość logiczną, prawdę lub fałsz. Dobrym przykładem jest Enum.any?, który zwraca prawdę, jeśli funkcje są prawdziwe dla dowolnej wartości, w przeciwnym razie zwracają fałsz
_
- Zignoruje to argument funkcji lub dopasowania wzorca. Jeśli chcesz, możesz nadać nazwę po podkreśleniu.Ex - _base
Jest to powszechnie używane na końcu funkcji rekursywnej ogona. Dobrym przykładem jest funkcja mocy. Jeśli chcesz podnieść dowolnym systemie liczbowym do 0 wynik it 1, więc to naprawdę nie ma znaczenia, co baza jest
defp getPower(_base,0), do: 1
.
- Służy do żadnej funkcji w module lub jak zaproponował powołanie anonimową funkcję
iex(1)> square = fn(number) -> number * number end
iex(2)> square.(4)
Nie istnieje istotne różnice między zmiennymi * początek * The '_' (takich jak '_foobar') i te, które składają się tylko * * od' _' (takich jak' def foo (_ _bar) do, _bar end'). Próby użycia '_' powodują błędy" niezwiązanej zmiennej "w czasie kompilacji. Zmienne poprzedzone znakiem podkreślenia, _bar, służą do zapobiegania ostrzeżeniom dotyczącym nieużywanych zmiennych i nie zapobiegają kompilacji. Ich użycie generuje tylko ostrzeżenie: "ostrzeżenie: podkreślona zmienna" _bar "jest używana po ustawieniu.Wiodący podkreślnik wskazuje, że wartość zmiennej powinna być ignorowana ... " – Marc