Цикл 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 comprehensionfor (p < -e ) yield e0
is translated toe.map { case p => e0 }
.
• A for loopfor (p < - e ) e0
is translated toe.foreach { case p => e0 }
.
...
Таким образом наш цикл, преобразуется к виду:
(1 to 10).foreach {
case i => println(i)
}
Где для для каждого i выполняется println(i).
Все просто и без императивщины.
Небольшое объявление
Благодаря моему бывшему шефу в аспирантуре и кафедре информатики МФТИ, в следующем учебном году в осеннем семестре будет преподаваться семестровый курс по выбору “ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА JAVA И SCALA”. Кому интересно — приходите.