我有一个收藏集:
@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
?
答案 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#loop,Enumerator#next和Enumerator#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) %>