Sintaxe para um loop for em ruby


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

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


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

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

17
array.each_index do |i|
  ...
end

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


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

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 

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

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}"}

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.