Предлагаемые решения страдают от того факта, что они либо явно перебирают коллекцию, либо заполняют коллекцию функцией. Более естественно придерживаться обычных идиом Scala и помещать указатель в обычные методы map или foreach. Это можно сделать с помощью запоминания. Полученный код может выглядеть как
myIterable map (doIndexed(someFunction))
Вот способ достижения этой цели. Рассмотрим следующую утилиту:
object TraversableUtil {
class IndexMemoizingFunction[A, B](f: (Int, A) => B) extends Function1[A, B] {
private var index = 0
override def apply(a: A): B = {
val ret = f(index, a)
index += 1
ret
}
}
def doIndexed[A, B](f: (Int, A) => B): A => B = {
new IndexMemoizingFunction(f)
}
}
Это уже все, что тебе нужно. Вы можете применить это, например, следующим образом:
import TraversableUtil._
List('a','b','c').map(doIndexed((i, char) => char + i))
, что приводит к списку
List(97, 99, 101)
Таким образом, вы можете использовать обычные функции Traversable за счет обертывания вашей эффективной функции. Наслаждайтесь!