Следующая итерация в цикле `each` - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть коллекция:

@monday = HomeTask.where(:class_room => current_user.class_room, :day => 'Понеділок').order(created_at: :desc)

Переменная @monday содержит данные из базы данных.В поле зрения я показываю все даты из коллекции:

<% @monday.each_with_index do |mnd, i| %>
  <% if mnd.data == mnd.data[i + 1] %>
    <%= link_to 'nice' %>
  <% else %>
    <%= link_to 'ohhh...' %>
  <% end %>
<% end %>

В теле if я хочу сослаться на следующий элемент.Но это не работает.В C ++, чтобы обратиться к следующему элементу в первой итерации, он должен быть закодирован следующим образом:

if(array[i] == array[i+1])

Как использовать each в Ruby?

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018
arr = [1,2,3,4,5,6,7,8]

enum = arr.to_enum
  #=> #<Enumerator: [1, 2, 3, 4, 5, 6, 7, 8]:each>    
loop { puts "%d : %d" % [enum.next, enum.peek] }
1 : 2
2 : 3
3 : 4
4 : 5
5 : 6
6 : 7
7 : 8

См. Ядро # to_enum 1 , Ядро # loop , Перечислитель # следующий и Перечислитель # peek.peek вызывает исключение StopIteration, когда оно выполняется после того, как был сгенерирован последний элемент arr.loop обрабатывает это исключение, прерывая цикл.

1.Относительно того, почему этот метод экземпляра Kernel задокументирован как метод экземпляра Object, см. Второй абзац в документации по Object .

0 голосов
/ 26 декабря 2018

Что если вы могли бы пойти со следующими изменениями,

-  <% if mnd.data == mnd.data[i + 1] %>
+  <% if @monday[i+1] != nil && mnd.data == @monday[i+1].data %>

Или просто,

-  <% if mnd.data == mnd.data[i + 1] %>
+  <% if mnd.data == @monday[i+1].try(:data) %>
0 голосов
/ 25 декабря 2018

Если вы хотите перебрать массив и иметь доступ к более чем одному элементу в каждой итерации, вы можете использовать each_cons

arr = [1,2,3,4,5,6,7,8]
arr.each_cons(2){|a,b| 
   puts "#{a} : #{b}"
}
# 1 : 2
# 2 : 3
# 3 : 4
# 4 : 5
# 5 : 6
# 6 : 7
# 7 : 8

Используя each_cons, вы можете легко сравнить два (или более) последовательных элементов массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...