Подтвердить что ты не робот

Какая разница между `def` и` defp` в Phoenix Framework?

Я читаю книгу программирования Phoenix, и мне интересно, какая разница между def и defp.

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

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

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

defp user_videos(user) do
...
end

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

4b9b3361

Ответ 1

Из Документация Elixirs по функциям внутри модулей:

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

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

Ответ 2

Итак, мой вопрос: как узнать, когда использовать 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 обертывает все частные функции, о которых не нужно знать никому другому модулю.