2016-03-01 14 views
28

Przechodzę przez książkę programowania Phoenix i zastanawiam się, jaka jest różnica między def i defp.Jaka jest różnica między `def` a` defp` w Phoenix Framework?

Istnieje kilka funkcji w moim kontrolera - większość z nich to działania takie jak ten:

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

Książka miała mnie utworzyć inną funkcję w tym kontrolerze, że nie jest to typowa akcja kontroler tak:

defp user_videos(user) do 
... 
end 

Moje pytanie brzmi: jak sprawdzić, kiedy używać defp i kiedy używać def podczas definiowania funkcji wewnątrz kontrolera w środowisku Phoenix Framework.

+4

Dotyczy to całego Elixir - nie tylko Phoenix Framework. Jest własnością Elixir - nie ramy. –

+1

Dobrze wiedzieć - dzięki. Jestem stosunkowo nowy w Erlang/Elixir/Phoenix. –

Odpowiedz

49

Od Elixir’s documentation on functions within modules:

wewnątrz modułu, możemy definiować funkcje z def/2 i funkcji prywatnych z defp/2. Funkcję zdefiniowaną przez def/2 można wywołać z innych modułów, podczas gdy funkcję prywatną można wywoływać tylko lokalnie.

Jeśli masz więcej pytań, przeczytaj tę dokumentację.

4

Więc moje pytanie brzmi: jak mam wiedzieć kiedy użyć defp i kiedy używać def przy definiowaniu funkcji wewnątrz kontrolera w ram Phoenix.

def funkcje modułu mogą być wywoływane z innych modułów, natomiast defp funkcje są prywatne, a nie wywoływać z innymi modułami. Skąd wiesz, kiedy używać def i kiedy używać defp? To zależy od tego, o czym inne moduły mogą lub nie muszą wiedzieć. Wspólna konstrukcja jest wzór na moduł w celu zapewnienia funkcji nadrzędnej def że otacza cały zachowania jego defp funkcji:

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 

Oto przykład ten z parsera do opiłków SEC: SEC Company Filings Parser. Główna metoda def obejmuje wszystkie prywatne funkcje, o których żaden inny moduł naprawdę nie musi wiedzieć.

Powiązane problemy