2016-03-29 91 views
0

我要動態地建立在我的模板類似的組件,所以我在page_view.ex創造了這個遞歸函數:爲什麼我的遞歸函數只在我的模板中打印一次?

defmodule MyProject.PageView do 
    use FabricaASA.Web, :view 

defmodule Recursion do 
    def buildElements(element,n) when n <= 1 do 
    element 
    end 

    def buildElements(element, n) do 
    element 
    buildElements(element, n - 1) 
    end 
end 

end 

然後,在我的模板我把它用:

<%= MyProject.PageView.Recursion.buildElements("LOL", 4) %> 

的問題是我得到的只是一個LOL而不是4 ...

回答

3

當您將element放在一起時,buildElement的遞歸版本在第一行有一個「無操作」,從而導致只有一個項目r蝕刻和其他人失去了。應該將它們一起收集在一個累加器中,例如一個列表。喜歡的東西:

def buildElements(element,n) when n <= 1 do 
    [element] # EDIT: Must be a list too 
end 
def buildElements(element, n) do 
    [element | buildElements(element, n - 1)] 
end 

更妙的是(恕我直言)比做清單的格式/級聯的計算,你可以在模板中遍歷它。

<%= for element <- MyProject.PageView.Recursion.buildElements("LOL", 4) do %> 
    <%= element %> 
<% end %> 
+0

謝謝勞羅。你的前半部分確定並可行,但是當我用你的模板來替換我的模板時(你的迴應的後半部分 - 「甚至更好......」),我得到一個我無法理解的錯誤(意外的令牌'結束')爲什麼... –

+0

哎唷,我錯過了'做'呼叫的結束。我更新了答案。 –

+0

當嘗試第二個選擇時,我得到一個錯誤:'沒有函數子句匹配在枚舉。「 - 減少/ 3列出^ foldl/2-0 - 」/ 3「。我需要更改視圖中的功能嗎? –

相關問題