2015-06-02 12 views
13

Sono curioso di sapere quando dovrei usare le clausole di corrispondenza di pattern vs guard durante la definizione delle funzioni.Elixir: Pattern Match o Guard

Ad esempio con pattern matching:

defmodule Exponent do 
    def power(value, 0), do: 1 
    def power(value, n), do: value*power(value, n-1) 
end 

vs clausola guardia:

defmodule Exponent do 
    def power(value, n) when n==0, do: 1 
    def power(value, n), do: value*power(value, n-1) 
end 

intendo entrambe producono lo stesso risultato, ma è una soluzione preferita all'altra? E se sì perché?

Sono nuovo per Elixir, quindi la risposta a questa domanda non mi è prontamente apparente (ancora). Grazie in anticipo.

+0

Osservi qualche differenza di prestazioni in un costrutto rispetto all'altro? Chiedere se uno è preferito rispetto all'altro mi colpisce come un grande esempio di una domanda che vuole un'opinione se non c'è differenza di prestazioni. Vota per chiudere. –

+0

Sono onestamente così nuovo che non ho ancora scoperto come persino valutare questo tipo di cose ... Non ho visto domande simili, quindi ho deciso di chiedere esplicitamente. – aren55555

+0

Potrebbe esserci una differenza tra un'implementazione e l'altra, ma senza alcun contesto è difficile dirlo. In questo momento stai facendo una domanda analoga a "quale è meglio, banane o fragole?" –

risposta

17

Le protezioni sono più potenti della corrispondenza del modello, ma introducono uno strato di complessità che potrebbe non essere necessario. Per semplici controlli di uguaglianza come nel tuo esempio, dovrebbero essere equivalenti in termini di prestazioni. Consiglio di provare a utilizzare la corrispondenza dei modelli prima per mantenere le cose semplici. È quindi possibile ricorrere a una clausola di guardia se assolutamente necessario. Tuttavia, potrebbe occasionalmente avere senso fare altrimenti quando è leggibile, ad es.

def sign(x) when x < 0, do: -1 
def sign(x) when x == 0, do: 0 
def sign(x) when x > 0, do: 1 

Suppongo che il caso d'uso "corretto" per l'operatore di uguaglianza in clausole di guardia è quando viene utilizzato come parte di espressioni più complesse, per esempio

def divisible?(x, divisor) when rem(x, divisor) == 0, do: true 
def divisible?(_x, _divisor), do: false 
Problemi correlati