凤凰城框架中`def`和`defp`有什么区别?

And*_*rie 60 elixir phoenix-framework

我正在阅读编程凤凰书,我想知道def和之间的区别是什么defp.

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

def new (conn, _params) do
...
end
Run Code Online (Sandbox Code Playgroud)

这本书让我在这个控制器中创建另一个函数,这不是典型的控制器动作,如下所示:

defp user_videos(user) do
...
end
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何在Phoenix Framework中的控制器内定义函数defp时知道何时使用以及何时使用def.

jos*_*mrb 86

Elixir关于模块内功能的文档:

在模块内部,我们可以使用def/2和私有函数定义函数defp/2.def/2可以从其他模块调用定义的函数,而只能在本地调用私有函数.

如果您有更多问题,请随时阅读该文档.


小智 5

所以我的问题是,我如何知道在Phoenix框架中的控制器中定义函数时何时使用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
Run Code Online (Sandbox Code Playgroud)

这是一个用于SEC归档的解析器的示例:SEC Company Filings Parser。main def方法包装了其他模块真正不需要知道的所有私有函数。