Вы можете получить то, что хотите, с ленивым «просмотром» последовательности,
var lastSecurity: Int = _
val securities = Seq(1, 2).view.map { a =>
lastSecurity = a
a
}
for (s <- securities) {
println("%d %d".format(s, lastSecurity))
}
печать
1 1
2 2
Ключевая идея здесь заключается в том, что в режиме отложенного просмотра map
вычисляется не сразу, а только как элементы, необходимые для цикла for.
Вот другой подход. Я не рекомендую это как хороший код, но он демонстрирует гибкость Scala,
var lastSecurity: Int = _
class SecurityWrapper(s: Seq[Int]) {
def foreach(f: Int => Unit) {
s.foreach { a =>
lastSecurity = a
f(a)
}
}
}
for (security <- new SecurityWrapper(Seq(1, 2))) {
println("%d %d".format(security, lastSecurity))
}
Класс SecurityWrapper
содержит пользовательский метод foreach
. На каждой итерации цикла он записывает в переменную lastSecurity
. for
сахар понимания Scala будет автоматически использовать SecurityWrapper.foreach
без какой-либо дополнительной работы с нашей стороны.