我在rails应用程序中的视图上使用ruby迭代器,如下所示:
<% (1..@document.data.length).each_with_index do |element, index| %>
...
<% end %>
我认为增加1 ..而不只是说:
@document.data
会得到上面的索引从1开始的技巧。但是,上面的代码索引仍然是0到data.length(-1有效)。所以我做错了什么,我需要索引等于1-data.length ...不知道如何设置迭代器来做到这一点。
答案 0 :(得分:75)
除非你使用像1.8这样的旧版Ruby(我认为这是在1.9中添加的,但我不确定),你可以使用each.with_index(1)
来获得一个基于1的枚举器:< / p>
在你的情况下,它会是这样的:
<% @document.data.length.each.with_index(1) do |element, index| %>
...
<% end %>
希望有所帮助!
答案 1 :(得分:27)
我想也许你误解了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
答案 2 :(得分:2)
使用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
答案 3 :(得分:1)
没有让索引从1开始的事情。如果你想跳过数组中的第一项,请使用next
。
<% (1..@document.data.length).each_with_index do |element, index| %>
next if index == 0
<% end %>
答案 4 :(得分:1)
数组索引始终为零。
如果你想跳过第一个元素,听起来就是这样:
@document.data[1..-1].each do |data|
...
end
答案 5 :(得分:1)
如果我理解你的问题是正确的,你想从1开始索引,但在ruby数组中作为0基本索引,所以最简单的方法是
给定@document.data
是一个数组
index = 1
@document.data.each do |element|
#your code
index += 1
end
HTH
答案 6 :(得分:1)
这可能与所讨论的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
答案 7 :(得分:0)
我遇到了同样的问题,并使用each_with_index方法解决了这个问题。但是在代码中为索引添加了1。
@someobject.each_with_index do |e, index|
= index+1