Да и нет, это зависит от того, что вы просите. Если вы спрашиваете, можете ли вы выполнить итерацию последовательности целых чисел без необходимости сначала строить эту последовательность, то да, вы можете, например, с помощью потоков:
def fromTo(from : Int, to : Int) : Stream[Int] =
if(from > to) {
Stream.empty
} else {
// println("one more.") // uncomment to see when it is called
Stream.cons(from, fromTo(from + 1, to))
}
Тогда:
for(i <- fromTo(0, 5)) println(i)
Написание собственного итератора путем определения hasNext и следующего - еще один вариант.
Если вы спрашиваете, можете ли вы использовать синтаксис 'for' для написания "собственного" цикла, то есть цикла, который работает путем увеличения некоторого собственного целого числа, а не итерации по значениям, генерируемым экземпляром объекта, тогда Ответ, насколько я знаю, нет. Как вы, возможно, знаете, 'for' - это синтаксический сахар для комбинации вызовов flatMap, filter, map и / или foreach (все они определены в признаке FilterMonadic ), в зависимости от вложенности генераторов и их типы. Вы можете попробовать скомпилировать некоторый цикл и вывести его промежуточное представление компилятора с помощью
scalac -Xprint:refchecks
чтобы увидеть, как они расширяются.