凤凰城框架中“def”和“defp”之间有什么区别?

时间:2016-03-01 23:35:33

标签: elixir phoenix-framework

我正在阅读编程凤凰书,我想知道defdefp之间的区别是什么。

我的控制器中有几个功能 - 大多数都是这样的动作:

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

这本书让我在这个控制器中创建了另一个不是典型的控制器动作的功能:

defp user_videos(user) do
...
end

所以我的问题是如何在凤凰城框架中的控制器内定义函数时,如何使用defp以及何时使用def

2 个答案:

答案 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方法包装了其他模块实际上不需要知道的所有私有函数。