2016-06-13 9 views

Odpowiedz

6

Jeśli funkcja ma kilka klauzul, Elixir spróbuje każdej klauzuli, dopóki nie znajdzie odpowiadającej. Pozwala to na "filtrowanie" na podstawie dostarczonych argumentów - szczególnie przydatne, jeśli funkcje nie mają wspólnej logiki.

def load([]), do: IO.puts("empty") 
def load(token) when token == nil, do: IO.puts("nil") # Matching `nil' is OK too. 
def load(token), do: process(token) 

Drugi punkt przedstawia zastosowanie osłon, które pozwalają na bardziej ogólne wyniki nie są a number of predicates that are valid as guards z których każdy może być przyłączony do (prawie) każdej ekspresji, które są stosowane do przełączania się na funkcji-argumentów rekurencyjnie lub Inaczej.

Ta konwencja obowiązuje we wszystkich istniejących językach BEAM i warto o tym pamiętać czytając dokumentację OTP.

+5

Dobrze, więc to też jest w porządku, '' def load (zero), do: IO.puts ("zero") '' Dziękuję. –

1

Wolę

def load(nil), do: nil 
def load([]), do: nil 
def load(token), do: process(token) 

Można również zrobić:

def load([]), do: nil 
def load(token) when not is_nil(token), do: process(token) 
def load(_), do: nil 

Ale nie porównać token == nil bo dostaniesz ostrzeżenie kompilatora.

Powiązane problemy