Let‘s see a example from the Programming in Scala book (page 451). If we have a definition like this:
trait RationalTrait {
val numerArg: Int
val denomArg: Int
}
Then numerArg and denomArg are called abstract vals & the trait can be used directly without extends, like this:
val x = new RationalTrait {
val numerArg = 1
val denomArg = 2
}
Or
val y = new {
val numerArg = 1
val denomArg = 1
} with RationalTrait
The above two are both valid Pre-initializing of abstract val in trait, except that when you need to put an expression value to abstract vals, you can only use the later form, like this:
val z = new {
val numerArg = 1 * x
val denomArg = 2 * x
} with RationalTrait
Another interesting example in book is to Pre-initialized fields in a class definition.
class RationalClass(n: Int, d: Int) extends {
val numerArg = n
val denomArg = d
} with RationalTrait {
def + (that: RationalClass) = new RationalClass(
numer * that.denom + that.numer * denom,
denom * that.denom
)
}