elixir - mac - phoenix framework tutorial
¿Cuál es la diferencia entre `def` y` defp` en Phoenix Framework? (2)
Entonces, mi pregunta es cómo sé cuándo usar defp y cuándo usar def al definir una función dentro de un controlador en Phoenix Framework.
def
funciones
def
de un módulo pueden llamarse desde otros módulos, mientras que
defp
funciones
defp
son privadas o no pueden llamarse desde otros módulos.
¿Cómo sabes cuándo usar
def
y cuándo usar
defp
?
Depende de lo que otros módulos puedan o no necesitar saber.
Un patrón de diseño común es que un módulo proporcione una función
def
primaria que envuelva todo el comportamiento de sus funciones
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
Aquí hay un ejemplo de esto con un analizador para las presentaciones de la
SEC
: Analizador de presentaciones de
la empresa SEC
.
El método de
def
principal envuelve todas las funciones privadas que ningún otro módulo realmente necesita conocer.
Estoy revisando el libro Programming Phoenix y me pregunto cuál es la diferencia entre
def
y
defp
.
Hay varias funciones en mi controlador, la mayoría de ellas son acciones como esta:
def new (conn, _params) do
...
end
El libro me hizo crear otra función en este controlador que no es una acción de controlador típica como esta:
defp user_videos(user) do
...
end
Entonces, mi pregunta es cómo sé cuándo usar
defp
y cuándo usar
def
al definir una función dentro de un controlador en Phoenix Framework.
De la documentación de Elixir sobre funciones dentro de los módulos :
Dentro de un módulo, podemos definir funciones con
def/2
y funciones privadas condefp/2
. Una función definida condef/2
puede invocarse desde otros módulos, mientras que una función privada solo puede invocarse localmente.
Si tiene más preguntas, no dude en leer esa documentación.