[英]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 1 , Kernel#loop , Enumerator#next和Enumerator#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.