Чтобы сделать что-то вроде:
myList(-n)
Вы можете определить неявное преобразование, которое позволяет вам:
myList.getFromRight(n)
Здесьэто код для неявного преобразования.Он создаст новый метод getFromRight для всех Seqs, поэтому он будет работать со списками, векторами и т. Д.
implicit def getFromRightImpl[A](s: Seq[A]) = new {
def getFromRight(n: Int) = s(s.length - n)
}
И вот несколько примеров:
scala> val v = Vector(1, 2, 3, 4)
v: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4)
scala> val l = List(1, 2, 3, 4)
l: List[Int] = List(1, 2, 3, 4)
scala> v.getFromRight(1)
res4: Int = 4
scala> l.getFromRight(3)
res5: Int = 2
Неявные преобразования являютсядовольно продвинутая функция Scala, но это один из идеальных вариантов их использования: если у объекта отсутствуют методы, которые, как вы думаете, должны быть у него, но изменение его с помощью наследования не является опцией, вы можете определить неявное преобразование в другой объект с помощьюметоды, которые вы хотите.