2016-03-01 50 views
28

我正在通過編程鳳凰書,我想知道defdefp之間的區別是什麼。鳳凰框架中的`def`和`defp`有什麼區別?

有我的控制器幾個功能 - 其中大多數都是這樣操作:

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

這本書讓我在這個控制器,它不是一個典型的控制器動作像這樣創建另一個功能:

defp user_videos(user) do 
... 
end 

所以我的問題是如何知道何時使用defp以及何時使用def在Phoenix Framework中的控制器內定義函數。

+4

Elixir的所有功能都是如此 - 不僅僅是鳳凰框架。這是Elixir的財產 - 而不是框架。 –

+1

很高興知道 - 謝謝。我對Erlang/Elixir/Phoenix比較陌生。 –

回答

49

Elixir’s documentation on functions within modules

裏面一個模塊,我們可以定義def/2功能和私人活動defp/2。使用def/2定義的函數可以從其他模塊調用,而私有函數只能在本地調用。

如果您有更多的問題,請隨時閱讀該文檔。

4

所以我的問題是如何知道什麼時候使用defp以及何時使用def在Phoenix Framework中的控制器內定義一個函數。一個模塊的

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方法包裝了其他模塊真正需要了解的所有私有函數。