web-dev-qa-db-ja.com

Phoenix Frameworkの `def`と` defp`の違いは何ですか?

プログラミングフェニックスの本を読んでいますが、defdefpの違いは何なのでしょうか。

私のコントローラーにはいくつかの機能があります-それらのほとんどはこのようなアクションです:

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

この本では、このコントローラーに別の関数を作成しましたが、これは次のような典型的なコントローラーアクションではありません。

defp user_videos(user) do
...
end

したがって、私の質問は、Phoenix Frameworkでコントローラー内の関数を定義するときに、いつdefpを使用するか、いつdefを使用するかを知ることです。

56
Andrew Hendrie

モジュール内の機能に関するElixirのドキュメント

モジュール内では、def/2で関数を定義し、defp/2でプライベート関数を定義できます。 def/2で定義された関数は他のモジュールから呼び出すことができますが、プライベート関数はローカルでのみ呼び出すことができます。

さらに質問がある場合は、そのドキュメントをお読みください。

80
josemrb

したがって、私の質問は、Phoenix Frameworkのコントローラー内で関数を定義するときにdefpを使用するタイミングとdefを使用するタイミングをどのように知るかです。

モジュールのdef関数は他のモジュールから呼び出すことができますが、defp関数はプライベートであるか、他のモジュールから呼び出すことはできません。 defをいつ使用し、defpをいつ使用するかをどのように知っていますか?それは、他のモジュールが知る必要があるかどうかに依存します。一般的な設計パターンは、モジュールがdeffunctionsのすべての動作をラップする親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メソッドは、他のモジュールが実際に知る必要のないすべてのプライベート関数をラップします。

5
vikram7