2016-03-29 33 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“。我需要更改视图中的功能吗? –

相关问题