【问题标题】:Why is my recursive function printing just once in my template?为什么我的递归函数在我的模板中只打印一次?
【发布时间】:2016-04-01 01:42:41
【问题描述】:

我想在我的模板中动态构建类似的组件,所以我在我的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 个 ...

【问题讨论】:

    标签: phoenix-framework


    【解决方案1】:

    当你单独放置element时,递归版本的buildElement在第一行有一个“无操作”,导致只返回一个项目,其他项目丢失。它们应该一起收集在一个累加器中,例如一个列表。比如:

    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 %>
    

    【讨论】:

    • 谢谢劳罗。你的前半部分没问题并且可以工作,但是当我用你的模板调用替换我的模板调用时(你的响应的后半部分 - “甚至更好......”)我收到一个我无法理解的错误(意外的令牌'结束')为什么...
    • 哎呀,我错过了do 的通话结束。我更新了答案。
    • 在尝试第二种选择时,我收到一个错误:no function clause matching in Enum."-reduce/3-lists^foldl/2-0-"/3。我需要更改视图中的功能吗?
    • 第二种选择是什么意思?模板中的for循环?如果您从 buildElements 返回列表/枚举,它应该可以工作。我只是在phoenixframework.org/docs/templates#section-displaying-lists中使用了与凤凰指南相同的结构@
    • 是的,但我收到了那个错误。没关系,你的功能很好用!现在我尝试从该函数中提取动态 ID,但我也遇到了麻烦(请参阅:stackoverflow.com/questions/36316858/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多