Синтаксис цикла for в Ruby

87

Как мне сделать этот тип цикла for в Ruby?

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

}
DNB5brims
источник
@johannes Читать книгу - хорошая идея, но желательно не о Ruby 1.6!
Эндрю Гримм
Не забудьте взглянуть на некоторые полезные методы в модуле ruby-doc: Enumerable .
Иван Чау

Ответы:

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

или

for element in array do
  element.do_stuff
end

Если вам нужен индекс, вы можете использовать это:

array.each_with_index do |element,index|
  element.do_stuff(index)
end
Эймантас
источник
15
я специально искал индексацию в цикле, ни одно из этих решений не дает сразу понять, как это сделать. оператор выдал свои намерения с помощью array.length в коде ...
jheriko 01
6
Прочтите мой ответ внимательно. Есть циклическое решение с включенной индексацией.
Eimantas
8
Часто eachэто здорово. Но иногда мне просто нужен чертовски традиционный цикл for. Иногда «Рубиновый путь» может просто раздражать.
Рубен Мартинес-младший
1
как мне вручную установить индекс в рубине, чтобы я мог сам написать сортировку
Мухаммад Умер
6
что, если я хочу пропустить следующие две итерации
Мухаммад Умер
77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

Другой способ сделать это следующий

3.times do |n|
  puts n;
end

это будет печатать 0, 1, 2, поэтому его также можно использовать как итератор массива

Думаю, этот вариант больше подходит автору

Ph0en1x
источник
29

Я продолжаю нажимать на эту ссылку как на главную ссылку для Google "ruby for loop", поэтому я хотел добавить решение для циклов, где шаг не был просто "1". В этих случаях вы можете использовать метод step, который существует для объектов Numerics и Date. Я думаю, что это близкое приближение к циклу 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
источник
20

Эквивалентность будет

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

или

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

или

i = 0
while i < array.size do
   array[i]
   i = i + 1 # where you may freely set i to any value
end
jsh-c
источник
17
array.each_index do |i|
  ...
end

Это не очень Rubyish, но это лучший способ сделать цикл for из вопроса в Ruby

EmFi
источник
Это великолепно. Верно, что ответ - нет, eachа скорее each_index. +1
Дэн Розенстарк
12

Чтобы повторить цикл фиксированное количество раз, попробуйте:

n.times do
  #Something to be done n times
end
yts
источник
10

Если вам не нужен доступ к вашему массиву (просто цикл for), вы можете использовать upto или each:

Вплоть до:

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

Каждый:

1.9.3p392 :031 > (2..4).each {|i| puts i}
2
3
4
 => 2..4 
Бенджамин Крузье
источник
8

Какие? С 2010 года, и никто не упоминал, что у Ruby есть штраф для цикла for / in (его просто никто не использует):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end
Steenslag
источник
5
Одним из преимуществ .each ... do является то, что блок временно выпадает из области видимости в конце цикла, тогда как for ... in оставляет временную область в области видимости.
Уэйн Конрад
4
['foo', 'bar', 'baz'].each_with_index {|j, i| puts "#{i} #{j}"}
ВЫ
источник
0

Синтаксис цикла перечисления Ruby отличается:

collection.each do |item|
...
end

Это читается как «вызов метода 'each' экземпляра объекта массива 'collection', который принимает блок с 'аргументом блока' в качестве аргумента». Синтаксис блока в Ruby - do ... end или {...} для однострочных операторов.

Аргумент блока '| item |' не является обязательным, но если он указан, первый аргумент автоматически представляет зацикленный элемент перечисления.

Джеки Джонсон
источник