2016-06-13 15 views
5

Come fare per filtrare i parametri non validi come nil o lista vuota prima di procedere all'elaborazione dei parametri?Elisir idiota da eseguire se i parametri non sono nulli?

L'uso di case sembra essere comune ma non è un codice chiaro. Sono abbastanza sicuro che esiste un modo più semplice e idiomatico per farlo.

def load(token) do 

    case token do 
    nil -> nil 
    [] -> nil 
    token -> process(token) 
    end 

end 

risposta

6

Se una funzione ha diverse clausole, Elixir cercherà ogni clausola finché non ne trova uno che corrisponde. Ciò consente di "filtrare" sulla base degli argomenti forniti - particolarmente utile se le funzioni non condividono alcuna logica comune.

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) 

La seconda clausola illustra l'uso di protezioni che consentono corrispondenze più generali, ci sono a number of predicates that are valid as guards ognuno dei quali può essere collegato a (quasi) qualsiasi espressione che vengono utilizzati per commutare sulla funzione-argomenti, ricorsivamente o altrimenti.

Questa convenzione vale per tutte le lingue BEAM esistenti ed è utile da tenere presente durante la lettura della documentazione OTP.

+5

Destra quindi anche questo va bene, '' def carico (nil), do: IO.puts ("nil") '' Grazie. –

1

preferisco

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

Si potrebbe anche fare:

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

Ma non vorrei confrontare token == nil perché si otterrà un avvertimento da parte del compilatore.

Problemi correlati