Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir模板-在具有迭代器值的列表中循环_Elixir - Fatal编程技术网

Elixir模板-在具有迭代器值的列表中循环

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

来自其他编程语言,许多像我一样的人都会大吃一惊。我有一个简单的问题。我有一个列表,比如说用户。我希望遍历用户并显示一些信息。非常简单,直到我被这个难倒:

使用eex模板,我尝试这样做:

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