web-dev-qa-db-fra.com

each_with_index_do à partir de 1 pour l'index

J'utilise un itérateur Ruby sur une vue dans une application Rails comme suit:

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

Je pensais que l’ajout du 1 .. au lieu de simplement dire: @document.data

l’index ci-dessus commencerait à 1. Mais hélas, l’index de code ci-dessus est toujours égal à 0 pour data.length (-1 effectivement). Alors qu'est-ce que je fais mal, j'ai besoin que l'index soit égal à 1-data.length ... aucune idée de la façon de configurer l'itérateur pour le faire.

17
Codejoy

Je pense que vous avez peut-être mal interprété each_with_index.

each va parcourir les éléments d'un tableau

[:a, :b, :c].each do |object|
  puts object
end

quelles sorties;

:a
:b
:c

each_with_index itère sur les éléments et passe également dans l'index (à partir de zéro)

[:a, :b, :c].each_with_index do |object, index|
  puts "#{object} at index #{index}"
end

qui sort

:a at index 0
:b at index 1
:c at index 2

si vous voulez qu'il soit indexé 1, ajoutez simplement 1.

[:a, :b, :c].each_with_index do |object, index|
  indexplusone = index + 1
  puts "#{object} at index #{indexplusone}"
end

qui sort

:a at index 1
:b at index 2
:c at index 3

si vous voulez parcourir un sous-ensemble d'un tableau, choisissez simplement le sous-ensemble, puis parcourez-le

without_first_element = array[1..-1]

without_first_element.each do |object|
  ...
end
26
Matthew Rudy

Sauf si vous utilisez un Ruby plus ancien comme 1.8 (je pense que cela a été ajouté dans 1.9 mais je ne suis pas sûr), vous pouvez utiliser each.with_index(1) pour obtenir un énumérateur basé sur 1:

Dans votre cas, ce serait comme ça:

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

J'espère que cela pourra aider!

67
Tyler Rick

Si je comprends bien votre question, vous voulez commencer l’index à partir de 1, mais dans les tableaux Ruby, l’indice de base est 0, donc le moyen le plus simple serait de

@document.data donné est un tableau

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

HTH

2
sameera207

Utilisez Integer#next :

[:a, :b, :c].each_with_index do |value, index|
  puts "value: #{value} has index: #{index.next}"
end

produit:

value: a has index: 1
value: b has index: 2
value: c has index: 3
2
abbottjam

Faire en sorte que l'index ne commence pas à partir de 1. Si vous voulez ignorer le premier élément du tableau, utilisez next.

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

Un index de tableau sera toujours basé sur zéro.

Si vous voulez ignorer le premier élément, cela ressemble à ce que vous faites:

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

J'ai eu le même problème et je l'ai résolu en utilisant la méthode each_with_index. Mais ajouté 1 à l'index dans le code.

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