operator - Contador automático en Ruby para cada uno?
ruby>= (8)
Como han dicho las personas, puedes usar
each_with_index
pero si desea índices con un iterador diferente a "cada uno" (por ejemplo, si desea asignar un índice o algo así) puede concatenar enumeradores con el método each_with_index, o simplemente usar with_index:
blahs.each_with_index.map { |blah, index| something(blah, index)}
blahs.map.with_index { |blah, index| something(blah, index) }
Esto es algo que puedes hacer desde ruby 1.8.7 y 1.9.
Quiero usar un for-each y un contador:
i=0
for blah in blahs
puts i.to_s + " " + blah
i+=1
end
Hay una mejor manera de hacerlo?
Nota: No sé si blahs
es una matriz o un hash, pero tener que hacer blahs[i]
no lo haría mucho más sexy. También me gustaría saber cómo escribir i++
en Ruby.
Técnicamente, la respuesta de Matt y Squeegy fue la primera, pero estoy dando la mejor respuesta a paradoja, por lo que me extendí un poco por los puntos. También su respuesta tenía la nota sobre las versiones, que sigue siendo relevante (siempre que mi Ubuntu 8.04 esté usando Ruby 1.8.6).
Debería haber usado puts "#{i} #{blah}"
que es mucho más conciso.
En cuanto a tu pregunta sobre hacer i++
, bueno, no puedes hacer eso en Ruby. La afirmación de i += 1
que tienes es exactamente cómo se supone que debes hacerlo.
La enumeración de series enumerables es bastante agradable.
Sí, es collection.each
para hacer bucles, y cada each_with_index
para obtener el índice.
Probablemente deberías leer un libro de Ruby porque es fundamental Ruby y si no lo sabes, vas a tener un gran problema (prueba: http://poignantguide.net/ruby/ ).
Tomado del código fuente de Ruby:
hash = Hash.new
%w(cat dog wombat).each_with_index {|item, index|
hash[item] = index
}
hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1}
Si blahs
es una clase que se mezcla en Enumerable, deberías poder hacer esto:
blahs.each_with_index do |blah, i|
puts("#{i} #{blah}")
end
Si desea obtener un índice de rubí para cada uno, puede usar
.each_with_index
Aquí hay un ejemplo para mostrar cómo funciona .each_with_index
:
range = (''a''..''z'').to_a
length = range.length - 1
range.each_with_index do |letter, index|
print letter + " "
if index == length
puts "You are at last item"
end
end
Esto se imprimirá:
a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item
Si no tiene la nueva versión de each_with_index
, puede usar el método zip
para emparejar índices con elementos:
blahs = %w{one two three four five}
puts (1..blahs.length).zip(blahs).map{|pair|''%s %s'' % pair}
que produce:
1 one
2 two
3 three
4 four
5 five
[:a, :b, :c].each_with_index do |item, i|
puts "index: #{i}, item: #{item}"
end
No puedes hacer esto con. Por lo general, me gusta la llamada más declarativa a cada persona de todos modos. En parte porque es fácil pasar a otras formas cuando alcanza el límite de la sintaxis for.