Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

scala - How does curly braces following trait instantiation work?

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:

  1. why use follow trait instantiation by curly braces?

  2. what is the purpose of trait instantiation in this case and other cases might also be helpful?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...