【问题标题】:What's the difference between `def` and `defp``def` 和 `defp` 有什么区别
【发布时间】:2016-06-14 15:06:34
【问题描述】:

我正在阅读 Programming Phoenix 这本书,我想知道 defdefp 之间的区别是什么。

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

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

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

defp user_videos(user) do
...
end

所以我的问题是,在 Elixir 中定义函数时,我如何知道何时使用 defp 以及何时使用 def

【问题讨论】:

  • 这适用于所有 Elixir——不仅仅是 Phoenix 框架。这是 Elixir 的属性,而不是框架的属性。

标签: elixir


【解决方案1】:

来自Elixir’s documentation on functions within modules

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

所以defp 定义了一个私有函数。

【讨论】:

    【解决方案2】:

    所以我的问题是,在 Phoenix 框架的控制器内定义函数时,我如何知道何时使用 defp 以及何时使用 def。

    一个模块的def 函数可以从其他模块调用,而defp 函数是私有的,或者不能从其他模块调用。您如何知道何时使用def 以及何时使用defp?这取决于其他模块可能需要或不需要知道的内容。一个常见的设计模式是模块提供一个父 def 函数,该函数包装了其 defpfunctions 的所有行为:

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

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2017-09-09
      • 2013-09-24
      • 2021-12-04
      • 1970-01-01
      • 2016-10-08
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多