For в Scala


Цикл for в Scala.

for ( i < - 1 to 10)  {
     println(i)
}

Что получится в итоге? Здесь все понятно. На консоль будут выведены числа от 1 до 10 включительно.

Как это работает? Здесь немножко сложнее...
Число 1 — это Int, будет неявно преобразован компилятором в тип RichInt.
У RichInt есть метод to(end:Int), который возвращает объект класса Inclusive, который наследуется от класса Range.
Такие объекты замечательны тем, что позволяют нам пробежаться по некоторому диапазону целых чисел с определенным шагом.
То есть наш цикл, аналогичен следующему примеру:

for ( i < - 1.to(10) )  {
     println(i)
}

Кстати, если вы хотите увеличить шаг до двух, вы можете воспользоваться методом to(end: Int, step: Int). Например:

for ( i < - 1 to (10,2) )  {
     println(i)
}

Идем дальше.
Оператор < - является генератором, который присваивает переменной i по-очереди значения из интервала [1,10] с шагом 1.
Как работает этот генератор для цикла for ?
Согласно спецификации языка, происходит следующее:

The translation scheme is as follows. In a first step, every generator p < -e, where p is not irrefutable (§8.1) for the type of e is replaced by p < - e.withFilter { case p => true; case _ => false }
Then, the following rules are applied repeatedly until all comprehensions have been
eliminated.
• A for comprehension for (p < -e ) yield e0 is translated to
e.map { case p => e0 }.
• A for loop for (p < - e ) e0 is translated to e.foreach { case p => e0 }.
...

Таким образом наш цикл, преобразуется к виду:

(1 to 10).foreach {
    case i => println(i)
}

Где для для каждого i выполняется println(i).
Все просто и без императивщины.

Небольшое объявление
Благодаря моему бывшему шефу в аспирантуре и кафедре информатики МФТИ, в следующем учебном году в осеннем семестре будет преподаваться семестровый курс по выбору “ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА JAVA И SCALA”. Кому интересно — приходите.

Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com