Elixir templates - looping through a list with iterator value -


coming other programming languages, many me in surprise. have simple problem. have list - say, users. want iterate through users , display information. pretty simple until got stumped this:

using eex template, trying this:

<%= <- 0..length(@users) %>   <% user = enum.at(@users) %>    <!-- every third user, need display on new "row" -->   <%= if rem(i,3) == 0 %>     <div class="row">   <% end %>    <!-- display user information - user name -->   <%= user.name %>    <!-- close out "row" tag if due starting on next iteration -->     <%= if rem(i+1,3) == 0 %>     <div class="row">   <% end %>   <% end %> 

firstly, user value turning out nil. not sure why. secondly, don't have explanation this.

what difference between "user = enum.at(@users, i)" , <%= user <- @users %>? in latter case, user not nil.

finally, best way keep track of times through list , take different action (like starting user on new row in example above)?

to keep things simple, have ignored fact may not have final closing "/div" tag row (which depends on number of users in list). i've ignored putting logic around focus on issue @ hand.

what difference between user = enum.at(@users, i) , <%= user <- @users %>? in latter case, user not nil.

you should getting user = nil last iteration. that's because you're looping 0 length(@users), , last iteration value length(@users) 1 more last valid index in list indexing 0 based. should loop 0 length(@users) - 1. note cause problems if @users empty enum.to_list(0..-1) #=> [0, -1].

finally, best way keep track of times through list , take different action (like starting user on new row in example above)?

i use enum.with_index , if. also, length in elixir slow (o(n)) operation, it's best cache value outside loop instead of recalculating on every iteration. believe meant print "</div>" in second if. here's final code:

<% users_length = length(@users) %> <%= {user, i} <- enum.with_index(@users) %>   <%= if rem(i, 3) == 0, do: ~s|<div class="row"| %>   <%= user.name %>   <%= if rem(i + 1, 3) == 0 || + 1 == users_length, do: "</div>" %> <% end %> 

Comments