Ruby ‘шные итераторы — each и collect
мая 5, 2010 | Published in Ruby, Основы
Итераторы являются не чем иным, как методами, поддерживающими коллекции. Коллекциями называются объекты, которые хранят в себе группы элементов данных. В массивы и хэши в Ruby также могут называться коллекциями, поскольку полностью соответствую вышеописанному определению коллекций.
Итераторы – это методы, которые последовательно проходят по всем элементам коллекции (массива или хэша) при этом выполняя над ними определенные операции. В этой статье мы рассмотрим два итератора – это итераторы each и collect. Давайте приступим!
Итератор each:
Итератор each проходит по всем элементам массива или хэша.
Синтаксис:
collection.each do |variable| code end
each выполняет код для каждого элемента в коллекции. Коллекцией, как уже говорилось, имеет право быть как массив, так и хэш.
Пример:
ary = [1,2,3,4,5] ary.each do |i| puts i end
Данная программа вернет следующий результат:
1
2
3
4
5
Итератор each всегда объединяется с блоком. Он возвращает каждый элемент массива, один за другим в блок. В данном примере значение сохраняется в переменной i и затем выводятся на экран.
Итератор collect:
Итератор collect возвращает все элементы коллекции.
Пример:
collection = collection.collect
Метод collect не всегда нуждается в объединении с блоком. collect возвращает всю коллекцию, независимо от того, является она массивом или хэшем.
Пример:
a = [1,2,3,4,5] b = Array.new b = a.collect puts b
После исполнения это программа вернет следующий результат:
1
2
3
4
5
Как вы видите, с помощью итератора collect мы создали копию массива a.
ПРИМЕЧАНИЕ: Метод collect не самый удачный способ создавать копии массивов. Это реализовывается другим методом – методом clone, который следует использовать для копирования одного массива в другой.
Обычно итератор collect используется когда необходимо сделать что-то с каждым элементом коллекции и результат поместить в новый массив. Пример ниже позволяет в массив b поместить каждое значение массива a умноженное на 10.
a = [1,2,3,4,5] b = a.collect{|x| 10*x} puts b
Результатом выполнения этой программы будет:
10
20
30
40
50
При этом массив a остался прежним и не претерпел каких-либо изменений.
Оригинал переведенной статьи здесь:
С другими итераторами мы познакомимся в следующих статьях. Удачи!