特征实例化后的花括号如何工作?

xia*_*012 16 scala traits

我在一些单元测试代码中发现了一些令人困惑的特性使用,例如:

trait MyTrait {
  val t1 = ... //some expression
  val t2 = ... //some expression
}
Run Code Online (Sandbox Code Playgroud)

然后使用new实例化特征,同时在实例化之后用花括号包裹一些表达式.

test("it is a test") {
  new MyTrait {
    // do something with t1 and t2
  }
}
Run Code Online (Sandbox Code Playgroud)

我对这种奇怪的语法感到困惑.

我的问题是:

  1. 为什么使用花括号跟随特征实例化?

  2. 在这种情况下特征实例化的目的是什么,其他情况也可能有帮助?

小智 36

您没有实例化特征:特征本身无法实例化; 只有非抽象类才可以.你在这里做的是使用Scala的简写,这两个定义,它扩展了特质的匿名/无名类,并在同一语句中实例化它.

val anonClassMixingInTrait = new MyTrait {
  def aFunctionInMyClass = "I'm a func in an anonymous class"
}
Run Code Online (Sandbox Code Playgroud)

相当于:

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

val namedClassMixingInTrait = new MyClass
Run Code Online (Sandbox Code Playgroud)

不同之处在于,您只能在定义时实例化该匿名类,因为它没有名称且不能具有构造函数参数.


dre*_*xin 9

Steve Buzzard已经解释过,匿名课程是什么,但你也问过这个目的.这里的目的是,在测试中,您经常有一些默认值,您希望在每个测试中使用.有时你也有状态,可能会被一些测试改变.要始终以正确的值开始(测试也可以并行运行),您可以将它们封装在这些匿名实例中.此匿名实例中的代码是构造函数,它将在实例化时进行评估,从而执行测试.