我在rails应用程序中的视图上使用ruby迭代器,如下所示:
<% (1..@document.data.length).each_with_index do |element, index| %>
...
<% end %>
我以为加1…而不是说:@document.data
可以让上面的索引从1开始。但是,唉,上面的代码索引仍然是0到data。长度(有效值为-1)。那么我做错了什么,我需要索引等于1-data。length…不知道如何设置迭代器来做这个
除非您使用的是像1.8这样的旧Ruby(我认为这是在1.9中添加的,但我不确定),否则您可以使用each.with_index(1)
来获得基于1的枚举器:
在你的例子中应该是这样的:
<% @document.data.length.each.with_index(1) do |element, index| %>
...
<% end %>
我想你可能误解了each_with_index
。
each
将遍历数组
[:a, :b, :c].each do |object|
puts object
end
输出;
:a
:b
:c
each_with_index
遍历元素,并传入索引(从零开始)
[:a, :b, :c].each_with_index do |object, index|
puts "#{object} at index #{index}"
end
输出:a at index 0
:b at index 1
:c at index 2
如果你想让它以1为索引,那就加1。
[:a, :b, :c].each_with_index do |object, index|
indexplusone = index + 1
puts "#{object} at index #{indexplusone}"
end
输出:a at index 1
:b at index 2
:c at index 3
如果你想遍历数组的一个子集,那么只需选择该子集,然后遍历它
without_first_element = array[1..-1]
without_first_element.each do |object|
...
end
这可能不是完全相同的each_with_index
方法的问题,但我认为结果可能接近的东西在mod是问…
%w(a b c).each.with_index(1) { |item, index| puts "#{index} - #{item}" }
# 1 - a
# 2 - b
# 3 - c
更多信息https://ruby-doc.org/core-2.6.1/Enumerator.html#method-i-with_index
使用Integer#next
:
[:a, :b, :c].each_with_index do |value, index|
puts "value: #{value} has index: #{index.next}"
end
生产:
value: a has index: 1
value: b has index: 2
value: c has index: 3
不存在让索引从1开始的情况。如果您想跳过数组中的第一项,请使用next
.
<% (1..@document.data.length).each_with_index do |element, index| %>
next if index == 0
<% end %>
数组索引总是从零开始。
如果你想跳过第一个元素,这听起来像是你要做的:
@document.data[1..-1].each do |data|
...
end
如果我对你的问题理解正确,你想从1开始索引,但在ruby数组中作为0个基本索引,所以最简单的方法是
给定@document.data
为数组
index = 1
@document.data.each do |element|
#your code
index += 1
end
HTH
我遇到了同样的问题,并通过使用each_with_index方法解决了这个问题。但是在代码中给索引加了1。
@someobject.each_with_index do |e, index|
= index+1
对于那些来这里寻找each_with_index
的人来说-你正在寻找with_index
。
将each_with_index
改为each.with_index(2)