2016-03-01 11 views
28

Sto esaminando il libro Phoenix di programmazione e mi chiedo quale sia la differenza tra def e defp.Qual è la differenza tra `def` e` defp` nel Phoenix Framework?

Ci sono diverse funzioni nel mio controller - la maggior parte di loro sono azioni come questa:

def new (conn, _params) do 
... 
end 

Il libro mi ha fatto creare un'altra funzione in questo controller che non è un tipico azione di controllo in questo modo:

defp user_videos(user) do 
... 
end 

Quindi la mia domanda è come sapere quando utilizzare defp e quando utilizzare def quando si definisce una funzione all'interno di un controller in Phoenix Framework.

+4

Questo vale per tutto l'elisir, non solo per il Phoenix Framework. È una proprietà di Elisir - non della struttura. –

+1

Buono a sapersi - grazie. Sono relativamente nuovo per Erlang/Elixir/Phoenix. –

risposta

49

Da Elixir’s documentation on functions within modules:

all'interno di un modulo, possiamo definire funzioni con def/2 e funzioni private con defp/2. Una funzione definita con def/2 può essere richiamata da altri moduli mentre una funzione privata può essere richiamata solo localmente.

Se avete altre domande, sentitevi liberi di leggere quella documentazione.

4

Quindi la mia domanda è come sapere quando utilizzare defp e quando utilizzare def quando si definisce una funzione all'interno di un controller in Phoenix Framework.

def funzioni di un modulo può essere chiamato da altri moduli, che defp funzioni sono private, o non richiamabile da altri moduli. Come fai a sapere quando usare def e quando usare defp? Dipende da ciò che gli altri moduli possono o non possono aver bisogno di sapere. Un modello di progettazione comune per un modulo per fornire una funzione def genitore che avvolge tutto il comportamento dei suoi defp funzioni:

defmodule MyModule do 

    def function do 
    # call all the defp functions below to do something 
    end 

    defp function2 do 
    # do something that no other module cares about or needs to know about 
    end 

    defp function3 do 
    # do something that no other module cares about or needs to know about 
    end 

    defp function4 do 
    # do something that no other module cares about or needs to know about 
    end 
end 

Ecco un esempio di questo con un analizzatore archivi SEC: SEC Company Filings Parser. Il metodo principale def include tutte le funzioni private di cui nessun altro modulo ha realmente bisogno di essere informato.

Problemi correlati