38

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

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

我认为添加 1.. 而不是仅仅说: @document.data

会得到让上面的索引从 1 开始的技巧。但是,上面的代码索引仍然是 0 到 data.length (有效地为 -1)。那么我做错了什么,我需要索引等于 1-data.length ...不知道如何设置迭代器来执行此操作。

4

8 回答 8

134

除非您使用的是 1.8 之类的旧 Ruby(我认为这是在 1.9 中添加的,但我不确定),否则您可以使用each.with_index(1)获取基于 1 的枚举器:

在你的情况下,它会是这样的:

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

希望有帮助!

于 2014-11-03T21:35:03.760 回答
35

我想也许你误会了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-indexed 那么只需添加 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
于 2013-01-17T20:39:04.267 回答
10

这可能与所讨论的方法不完全相同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

于 2019-03-08T14:59:44.233 回答
8

使用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
于 2018-01-04T08:24:35.507 回答
2

没有让索引从 1 开始这样的事情。如果要跳过数组中的第一项,请使用next.

<% (1..@document.data.length).each_with_index do |element, index| %>
  next if index == 0
<% end %>
于 2013-01-17T20:38:34.783 回答
1

数组索引总是从零开始。

如果你想跳过第一个元素,这听起来像你这样做:

@document.data[1..-1].each do |data|
   ...
end
于 2013-01-17T20:38:47.560 回答
1

如果我正确理解您的问题,您想从 1 开始索引,但在 ruby​​ 数组中,基本索引为 0,所以最简单的方法是

给定@document.data的是一个数组

index = 1
@document.data.each do |element| 
    #your code
    index += 1
end

高温高压

于 2013-01-17T20:43:42.783 回答
0

我有同样的问题,并通过使用 each_with_index 方法解决了它。但是在代码中的索引中添加了 1。

@someobject.each_with_index do |e, index|
   = index+1
于 2017-02-24T13:07:41.950 回答