В чем разница между " def " и "defp" в рамках Phoenix?

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

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

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

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

defp user_videos(user) do
...
end

поэтому мой вопрос в том, как я знаю, когда использовать defp и когда использовать def при определении функции внутри контроллера в рамках Phoenix.

2 ответов


С документация Elixir по функциям в модулях:

внутри модуля, мы можем определить функции def/2 и частные функции с defp/2. Функция, определенная с помощью def/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 filings:SEC Company Filings Parser. Главный def метод обертывает все частные функции, о которых не должен знать ни один другой модуль.