Самый простой способ добавить метод в класс в Scala:
implicit def defSum(l: List[Double]): Double = new AnyRef { def sum = l.foldLeft(0.0)(_ + _) }
Или, в Scala 2.8, с частным случаем обработки чисел методом,
implicit def defSum[T](l: List[T])(implicit n: Numeric[T]) = new AnyRef {
import n.mkNumericOps
def sum = l.foldLeft(n.zero)(_ + _)
}
Только это не требуется в Scala 2.8, поскольку оно уже определяет sum
.
Вы также можете добавить черты при создании экземпляра:
// Immutable class
case class Point(x: Int, y: Int)
// Somewhere else in the code
trait MyPlot {
self: Point =>
import self._
def plot = println("At "+x+", "+y)
}
// Usage
val p = new Point(1,2) with MyPlot
p.plot
То, что вы не можете сделать, это динамически добавить метод (т. Е. Во время выполнения вместо времени компиляции) к объекту. В первом случае вы говорите «добавить этот метод в этот класс». Во втором случае вы говорите «создайте этот объект с этой чертой». Это нормально, но «добавить этот метод к этому объекту» нельзя.