gpt4 book ai didi

Elixir 模板 - 遍历具有迭代器值的列表

转载 作者:行者123 更新时间:2023-12-05 08:56:47 27 4
gpt4 key购买 nike

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

使用一个 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 %>

首先,用户值(value)变成了零。不知道为什么。其次,我对此没有任何解释。

"user = Enum.at(@users, i)"和 <%= for user <- @users %> 有什么区别?在后一种情况下,用户不为零。

最后,跟踪列表中的时间并采取稍微不同的操作(比如在上面的示例中让用户在新行开始)的最佳方法是什么?

为简单起见,我还忽略了一个事实,即我们可能没有行的最终结束“/div”标记(这取决于列表中的用户数量)。我忽略了任何逻辑,只是专注于手头的问题。

最佳答案

What is the difference between user = Enum.at(@users, i) and <%= for user <- @users %>? In the latter case, the user is not nil.

你应该得到 user = nil对于最后一次迭代。那是因为你从 0 开始循环至 length(@users) ,最后一次迭代值将为 length(@users)这比列表中最后一个有效索引多 1,因为索引是基于 0 的。你应该从 0 循环至 length(@users) - 1 .请注意,如果@users,这将导致问题为空 Enum.to_list(0..-1) #=> [0, -1] .

Finally, what is the best way to keep track of the times through the list and take a slightly different action (like starting the user on a new row as in the example above)?

我会使用 Enum.with_indexif .另外,length在 Elixir 中是一个缓慢的 ( O(n) ) 操作,所以最好在循环外缓存它的值,而不是在每次迭代时重新计算它。我也相信你打算打印 "</div>"在第二个 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 %>

关于Elixir 模板 - 遍历具有迭代器值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38841248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com