Each_with_index_do从1开始索引



我在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)

相关内容

  • 没有找到相关文章

最新更新