2016-03-29 24 views
0

Dinamik benim şablonları benzer bileşenleri kurmak istiyorum, bu yüzden page_view.ex bu özyinelemeli fonksiyon oluşturuldu:Yinelemeli işlevim neden şablonumda yalnızca bir kez yazdırılıyor?

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

sorundur:

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 

Sonra benim şablonda kullanıyorum diyoruz 4 ...

cevap

3

yerine yinelemeli sürüm element ilk satırında "işlem yok" tek başına, yalnızca bir öğe r sonuçlanır etekler ve diğerleri kaybetti. Bir akümülatörde, örneğin bir listede toplanmalıdırlar. gibi bir şey: hesaplamasında listenin biçimlendirme/birleştirme yaparak daha

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 

Ve hatta daha iyi (IMHO), şablonda üzerinde yineleme yapabilirsiniz.

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

Teşekkür ederim Lauro. İlk yarınız tamam ve işe yarıyor, ama şablon çağrılarımı sizin yerine koyduğum zaman (cevabınızın ikinci yarısı - "Ve daha da iyisi ...") Anlayamadığım bir hata alıyorum (beklenmedik bir simge 'son') Neden ... –

+0

Ouch, aramayı bitiremedim. Cevabı güncelledim. –

+0

İkinci alternatifi denerken bir hata alıyorum: 'Enum öğesinde eşleme işlevi yok.” - azalt/3 liste^foldl/2-0 - "/ 3'. Görünümdeki işlevi değiştirmem gerekiyor mu? –

İlgili konular