簡體   English   中英

每個循環中的下一個迭代

[英]Next iteration in `each` loop

我有一個收藏:

@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

如果要迭代數組並在每次迭代中可以訪問多個項目,則可以使用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,您可以輕松比較數組中的兩個(或更多)連續項。

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 1Kernel#loopEnumerator#nextEnumerator#peek 在生成了arr的最后一個元素之后執行peek時,它將引發StopIteration異常。 loop通過中斷loop處理該異常。

1.關於為什么將此Kernel實例方法記錄為Object實例方法的原因,請參閱docs上Object的第二段。

如果可以進行以下更改,該怎么辦?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM