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