我正在阅读编程凤凰书,我想知道def
和defp
之间的区别是什么。
我的控制器中有几个功能 - 大多数都是这样的动作:
def new (conn, _params) do
...
end
这本书让我在这个控制器中创建了另一个不是典型的控制器动作的功能:
defp user_videos(user) do
...
end
所以我的问题是如何在凤凰城框架中的控制器内定义函数时,如何使用defp
以及何时使用def
。
答案 0 :(得分:77)
来自Elixir’s documentation on functions within modules:
在模块内部,我们可以使用
def/2
定义函数,使用defp/2
定义私有函数。使用def/2
定义的函数可以从其他模块调用,而私有函数只能在本地调用。
如果您有更多问题,请随时阅读该文档。
答案 1 :(得分:4)
可以从其他模块调用模块的所以我的问题是如何在凤凰城框架中的控制器内定义函数时如何知道何时使用defp以及何时使用def。
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
方法包装了其他模块实际上不需要知道的所有私有函数。