2016-03-01 5 views
28

Я прохожу через Программу книги Феникса, и мне интересно, какая разница между def и defp есть.В чем разница между `def` и` defp` в Phoenix Framework?

Есть несколько функций в моем контроллере - большинство из них являются действия, как это:

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

Книга была мне создать еще одну функцию в этом контроллере, который не является типичным действие контроллера, как это:

defp user_videos(user) do 
... 
end 

Так что мой вопрос: как узнать, когда следует использовать defp и когда использовать def при определении функции внутри контроллера в Phoenix Framework.

+4

Это относится ко всем Эликсиру - не только к Феникс-каркасу. Это свойство Эликсира, а не рамки. –

+1

Полезно знать - спасибо. Я относительно новичок в Erlang/Elixir/Phoenix. –

ответ

49

От Elixir’s documentation on functions within modules:

Внутри модуля, мы можем определить функции с def/2 и частные функции с defp/2. Функция, определенная с помощью def/2, может быть вызвана из других модулей, в то время как частная функция может быть вызвана только локально.

Если у вас есть дополнительные вопросы, ознакомьтесь с этой документацией.

4

Так что мой вопрос: как узнать, когда использовать defp и когда использовать def при определении функции внутри контроллера в Phoenix Framework.

def функция модуль может быть вызвана из других модулей, в то время как defp функций являются частными, или не вызывать из других модулей. Откуда вы знаете, когда использовать def и когда использовать defp? Это зависит от того, что другие модули могут или не обязательно знать. Общий шаблон дизайна для модуля, чтобы обеспечить родительскую def функцию, которая оборачивает все поведение своих defp функций:

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 

Вот пример этого с анализатором для SEC опилок: SEC Company Filings Parser. Основной метод def обертывает все частные функции, о которых не нужно знать никому другому модулю.

Смежные вопросы