Explanation of Scala construct

64 Views Asked by At

I am busy with a major refactoring task on some legacy Scala/Akka code, and am being haunted by a construct that I am unable to explain, which is hampering my effort:

trait PerRequestCreator {
  this: Actor =>
  def perRequest(<some_params>): ActorRef = { body of function }
}

Which is then used as such:

class SomeActor extends PerRequestCreator with Actor {
  def processRequest: Route = {
    perRequest(<some_params_passed>)
  }
}

I am having trouble understanding the this: Actor => ... part of the trait.

1

There are 1 best solutions below

0
On BEST ANSWER

It's called self-type, and it expresses a requirement for the PerRequestCreator to be mixed in into something that extends Actor.

It's useful because now you can use anything defined in Actor inside the definition of PerRequestCreator and the compiler will check that you can only extend PerRequestCreator if you also extend Actor.

Example:

class SomeClass extends PerRequestCreator            // this won't compile
class SomeClass extends PerRequestCreator with Actor // this is ok

You can read more about it here: https://docs.scala-lang.org/tour/self-types.html