Elixir模板-在具有迭代器值的列表中循环
来自其他编程语言,许多像我一样的人都会大吃一惊。我有一个简单的问题。我有一个列表,比如说用户。我希望遍历用户并显示一些信息。非常简单,直到我被这个难倒: 使用eex模板,我尝试这样做:Elixir模板-在具有迭代器值的列表中循环,elixir,Elixir,来自其他编程语言,许多像我一样的人都会大吃一惊。我有一个简单的问题。我有一个列表,比如说用户。我希望遍历用户并显示一些信息。非常简单,直到我被这个难倒: 使用eex模板,我尝试这样做: <%= for i <- 0..length(@users) do %> <% user = Enum.at(@users) %> <!-- every third user, I need to display on a new "row" --> <
<%= for i <- 0..length(@users) do %>
<% user = Enum.at(@users) %>
<!-- every third user, I need to display on a new "row" -->
<%= if rem(i,3) == 0 do %>
<div class="row">
<% end %>
<!-- display user information - like user name -->
<%= user.name %>
<!-- then close out the "row" tag if we are due for starting another on the next iteration -->
<%= if rem(i+1,3) == 0 do %>
<div class="row">
<% end %>
<% end %>
首先,用户价值是零。不知道为什么。第二,我对此没有解释
“user=Enum.at(@users,i)”和之间的区别是什么?我最终使用了Enum.with_index(@users),这也给了我理解范围内的索引,但我仍然想从一些专家那里了解上述行为。为了其他人的利益,以下是我提出的解决方案(也许有更好的解决方案。我很乐意听到)
长度(@users)do%>
user=Enum.at(@users,i)
和[0,-1]
之间有什么区别
最后,通过列表跟踪时间并采取稍微不同的操作(如在上面的示例中在新行上启动用户)的最佳方法是什么
我会使用Enum.with_index
和if
。另外,Elixir中的length
是一个缓慢的(O(n)
)操作,因此最好将其值缓存在循环之外,而不是在每次迭代时重新计算。我还相信你是想在第二个if
中打印“
。以下是最终代码:
<% users_length = length(@users) %>
<%= for {user, i} <- Enum.with_index(@users) %>
<%= if rem(i, 3) == 0, do: ~s|<div class="row"| %>
<%= user.name %>
<%= if rem(i + 1, 3) == 0 || i + 1 == users_length, do: "</div>" %>
<% end %>
我认为一个问题是您需要从0循环到length-1,而不是从0循环到length
。因为您循环到最后一个递归的长度,Enum.at(@users,length
)给出了nil
在
<% users_length = length(@users) %>
<%= for {user, i} <- Enum.with_index(@users) %>
<%= if rem(i, 3) == 0, do: ~s|<div class="row"| %>
<%= user.name %>
<%= if rem(i + 1, 3) == 0 || i + 1 == users_length, do: "</div>" %>
<% end %>