How does curly braces following trait instantiation work?

scala, traits

Solution

You are not instantiating the traits: traits by themselves cannot be instantiated; only non-abstract classes can. What you are doing here is using Scala's shorthand for both defining an anonymous/nameless class that extends the trait and instantiating it in the same statement.

val anonClassMixingInTrait = new MyTrait {
  def aFunctionInMyClass = "I'm a func in an anonymous class"
}

Is the equivalent of:

class MyClass extends MyTrait {
  def aFunctionInMyClass = "I'm a func in a named class"
}

val namedClassMixingInTrait = new MyClass

The difference is you can only instaniate that anonymous class at the time of definition since it doesn't have a name and it can't have constructor arguments.

Problem

I find some confusing use of trait in some unittesting code, such as: ``` trait MyTrait { val t1 = ... //some expression val t2 = ... //some expression } ``` And then instantiate the trait using new and meanwhile some expressions wrapped by curly braces followed the instantiation. ``` test("it is a test") { new MyTrait { // do something with t1 and t2 } } ``` I am confused by this strange syntax. My question is: why use follow trait instantiation by curly braces? what is the purpose of trait instantiation in this case and other cases might also be helpful?

Original source

Related problems