Each_with_index_do начиная с 1 для индекса

Я использую ruby-итератор на представлении в приложении rails, например:

<% ([email protected]).each_with_index do |element, index| %>
  ...
<% end %>

Я думал, что добавление 1.. вместо того, чтобы просто сказать:  @document.data

получит трюк с тем, что индекс выше начинается с 1. Но, увы, вышеуказанный индекс кода по-прежнему равен 0 в data.length(-1 эффективно). Итак, что я делаю неправильно, мне нужен индекс, равный 1-data.length... не знаю, как настроить итератор для этого.

Ответ 1

Я думаю, может быть, вы неправильно поняли 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

Если вы используете более старый Ruby, например 1.8 (я думаю, что это было добавлено в 1.9, но я не уверен), вы можете использовать each.with_index(1), чтобы получить 1-основанный перечислитель:

В вашем случае это будет так:

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

Надеюсь, что это поможет!

Ответ 3

Нет такой вещи, как запуск индекса с 1. Если вы хотите пропустить первый элемент в массиве, используйте next.

<% ([email protected]).each_with_index do |element, index| %>
  next if index == 0
<% end %>

Ответ 4

Индекс массива всегда будет на нулевом уровне.

Если вы хотите пропустить первый элемент, который звучит так, как вы:

@document.data[1..-1].each do |data|
   ...
end

Ответ 5

Если я правильно понимаю ваш вопрос, вы хотите начать индексирование с 1, но в рубиновых массивах идет 0 базовых индексов, поэтому самый простой способ -

данный @document.data - массив

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

НТН

Ответ 6

Используйте 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

Ответ 7

У меня была та же проблема, и я решил ее использовать с помощью метода each_with_index. Но добавил 1 к индексу в коде.

@someobject.each_with_index do |e, index|
   = index+1