2013-01-17 16 views
11

Sto usando un iteratore rubino su una vista in un app rotaie in questo modo:each_with_index_do a partire da 1 per l'indice

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

ho pensato che l'aggiunta del 1 .. invece di dire semplicemente: @document.data

otterrebbe il trucco di avere l'indice sopra inizio a 1. Ma ahimè, l'indice di codice sopra è ancora da 0 a data.length (-1 in modo efficace). Quindi, cosa sto facendo male, ho bisogno che l'indice sia uguale a 1-data.length ... non ho idea di come impostare l'iteratore per farlo.

+0

Il primo indice di un array è sempre sarà '0 '. – Kyle

+0

L'indice sarà sempre a base zero. Perchè importa? –

+0

@Codejoy - Sarebbe saggio estendere/accettare alcune risposte poiché la tua domanda ha ricevuto risposta da più utenti. – Kyle

risposta

19

Penso che forse si fraintendono each_with_index.

each sarà iterare elementi dell'array

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

che fornisce in uscita;

:a 
:b 
:c 

each_with_index itera sugli elementi, e anche passa nell'indice (partendo da zero)

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

che emette

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

se si desidera 1-indicizzato poi basta aggiungere 1.

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

quali uscite

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

se si desidera iterare su un sottoinsieme di una matrice, poi basta scegliere il sottoinsieme, quindi scorrere su di esso

without_first_element = array[1..-1] 

without_first_element.each do |object| 
    ... 
end 
+0

ok ho capito l'errore dei miei modi. – Codejoy

+0

no worries @Codejoy –

2

Non esiste una cosa come far partire l'indice da 1. Se si desidera saltare il primo elemento nell'array utilizzare next.

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

Trivia: Perl ha una variabile globale '$ [' è possibile impostare la creazione di tutti gli indici di matrice a partire da 1 o qualsiasi altro valore. Dovremmo essere VERY GLAD Ruby non ha questo. –

2

Un indice di array sarà sempre basato su zero.

Se si vuole saltare il primo elemento, che suona come si fa:

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

Se ho capito la tua domanda giusta, è voglio iniziare l'indice da 1, ma in ruby ​​array va come 0 indici di base, quindi il modo più semplice sarebbe

dato @document.data è un array

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

HTH

+0

non è la cosa più bella di sempre ma funziona Grazie – MZaragoza

42

A meno che non si sta utilizzando un vecchio Rubino come 1.8 (credo che questo è stato aggiunto a 1.9 ma non sono sicuro), è possibile utilizzare each.with_index(1) per ottenere un enumeratore 1-based:

Nel tuo caso sarebbe come questo:

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

Speranza che aiuta!

+3

Certamente la migliore risposta in questi giorni. –

0

Ho avuto lo stesso problema e l'ho risolto utilizzando il metodo each_with_index. Ma aggiunto 1 all'indice nel codice.

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

Uso Integer#next:

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

produce:

value: a has index: 1 
value: b has index: 2 
value: c has index: 3 
Problemi correlati