每个循环中的下一个迭代

时间:2018-12-25 19:17:59

标签: ruby-on-rails ruby

我有一个收藏集:

@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])

如何在Ruby中使用each

3 个答案:

答案 0 :(得分:5)

如果要迭代数组并在每次迭代中都可以访问多个项目,则可以使用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,您可以轻松比较数组中两个(或多个)连续的项目。

答案 1 :(得分:4)

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

请参见Kernel#to_enum 1 Kernel#loopEnumerator#nextEnumerator#peek。当peek的最后一个元素生成后执行时,StopIteration会引发arr异常。 loop通过打破循环来处理该异常。

1。关于为什么将此Kernel实例方法记录为Object实例方法的原因,请参阅文档中Object的第二段。

答案 2 :(得分:0)

如果可以进行以下更改怎么办?

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