each_with_index_do从1开始索引

时间:2013-01-17 20:31:06

标签: ruby ruby-on-rails-3 iterator

我在rails应用程序中的视图上使用ruby迭代器,如下所示:

<% (1..@document.data.length).each_with_index do |element, index| %>
  ...
<% end %>

我认为增加1 ..而不只是说:  @document.data

会得到上面的索引从1开始的技巧。但是,上面的代码索引仍然是0到data.length(-1有效)。所以我做错了什么,我需要索引等于1-data.length ...不知道如何设置迭代器来做到这一点。

8 个答案:

答案 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