Какая разница между `def` и` defp` в Phoenix Framework?
Я читаю книгу программирования Phoenix, и мне интересно, какая разница между def
и defp
.
В моем контроллере есть несколько функций - большинство из них - такие действия:
def new (conn, _params) do
...
end
В книге мне была создана другая функция в этом контроллере, которая не является типичным действием контроллера следующим образом:
defp user_videos(user) do
...
end
Итак, мой вопрос: как узнать, когда использовать defp
и когда использовать def
при определении функции внутри контроллера в Phoenix Framework.
Ответы
Ответ 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
обертывает все частные функции, о которых не нужно знать никому другому модулю.