我在一些单元测试代码中发现了一些令人困惑的特性使用,例如:
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)
我对这种奇怪的语法感到困惑.
我的问题是:
为什么使用花括号跟随特征实例化?
在这种情况下特征实例化的目的是什么,其他情况也可能有帮助?
小智 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)
不同之处在于,您只能在定义时实例化该匿名类,因为它没有名称且不能具有构造函数参数.
Steve Buzzard已经解释过,匿名课程是什么,但你也问过这个目的.这里的目的是,在测试中,您经常有一些默认值,您希望在每个测试中使用.有时你也有状态,可能会被一些测试改变.要始终以正确的值开始(测试也可以并行运行),您可以将它们封装在这些匿名实例中.此匿名实例中的代码是构造函数,它将在实例化时进行评估,从而执行测试.
| 归档时间: |
|
| 查看次数: |
5272 次 |
| 最近记录: |