Sintaxe para um loop for em ruby

87

Como faço esse tipo de loop for em Ruby?

for(int i=0; i<array.length; i++) {

}
DNB5brims
fonte
@johannes Ler um livro é uma boa ideia, mas de preferência não sobre Ruby 1.6!
Andrew Grimm,
Não se esqueça de dar uma olhada em alguns métodos úteis em ruby-doc: Módulo enumerável .
Ivan Chau

Respostas:

118
array.each do |element|
  element.do_stuff
end

ou

for element in array do
  element.do_stuff
end

Se precisar de índice, você pode usar este:

array.each_with_index do |element,index|
  element.do_stuff(index)
end
Eimantas
fonte
15
Eu estava procurando especificamente por indexação em um loop, nenhuma dessas soluções torna imediatamente óbvio como fazer isso. o op traiu suas intenções com array.length no código ...
jheriko
6
Leia minha resposta com atenção. Existe uma solução de loop com indexação incluída.
Eimantas
8
Muitas vezes, eaché ótimo. Mas às vezes eu só quero um loop for tradicional maldito. Às vezes, o "jeito Ruby" pode ser simplesmente irritante.
Ruben Martinez Jr.
1
como faço para definir manualmente o índice em ruby ​​para que eu possa escrever um tipo sozinho
Muhammad Umer
6
e se eu quiser pular as próximas duas iterações
Muhammad Umer
77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

a outra maneira de fazer isso é a seguinte

3.times do |n|
  puts n;
end

isso imprimirá 0, 1, 2, então também pode ser usado como um iterador

Acho que essa variante se ajusta melhor às necessidades do autor

Ph0en1x
fonte
29

Eu continuo acertando isso como um link principal para o google "ruby for loop", então eu queria adicionar uma solução para loops onde a etapa não fosse simplesmente '1'. Para esses casos, você pode usar o método 'step' existente nos objetos Numerics e Date. Eu acho que esta é uma aproximação próxima para um loop 'for'.

start = Date.new(2013,06,30)
stop = Date.new(2011,06,30)
# step back in time over two years, one week at a time
start.step(stop, -7).each do |d| 
    puts d
end
DSZ
fonte
20

A equivalência seria

for i in (0...array.size)
end

ou

(0...array.size).each do |i|
end

ou

i = 0
while i < array.size do
   array[i]
   i = i + 1 # where you may freely set i to any value
end
jsh-c
fonte
17
array.each_index do |i|
  ...
end

Não é muito Ruby, mas é a melhor maneira de fazer o loop for de question em Ruby

EmFi
fonte
Isto é brilhante. É verdade que a resposta não é, eachmas sim each_index. +1
Dan Rosenstark
12

Para iterar um loop um número fixo de vezes, tente:

n.times do
  #Something to be done n times
end
yts
fonte
10

Se você não precisa acessar seu array , (apenas um simples loop for), você pode usar até ou cada:

Até:

1.9.3p392 :030 > 2.upto(4) {|i| puts i}
2
3
4
 => 2 

Cada:

1.9.3p392 :031 > (2..4).each {|i| puts i}
2
3
4
 => 2..4 
Benjamin Crouzier
fonte
8

O que? De 2010 e ninguém mencionou Ruby tem um loop for / in (apenas ninguém o usa):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end
Steenslag
fonte
5
Uma vantagem de .each ... do é que o bloco temporário sai do escopo no final do loop, enquanto que for ... in deixa o temporário no escopo.
Wayne Conrad de
4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}
VOCÊS
fonte
0

A sintaxe do loop de enumeração de Ruby é diferente:

collection.each do |item|
...
end

Isso é lido como "uma chamada para o método 'each' da instância do objeto array 'collection' que recebe bloco com 'blockargument' como argumento". A sintaxe de bloco em Ruby é 'do ... end' ou '{...}' para instruções de uma única linha.

O argumento do bloco '| item |' é opcional, mas se fornecido, o primeiro argumento representa automaticamente o item enumerado em loop.

JackyJohnson
fonte