我发现在一些单元测试代码,如一些容易混淆的使用特质:
trait MyTrait {
val t1 = ... //some expression
val t2 = ... //some expression
}
然后使用新的,同时一些表达式被大括号包裹,随后实例化实例化特质。
test("it is a test") {
new MyTrait {
// do something with t1 and t2
}
}
我被这个奇怪的语法混淆。
我的问题是:
为什么使用遵循大括号特质实例?
是什么特质实例的目的,在这种情况下,和其他案件也可能会有所帮助?
您还没有实例化特点:本身特质不能被实例化; 只有非抽象类可以。 你在这里做的是使用Scala的简写,这两个定义,它扩展了特质的匿名/无名类,并在同一语句中实例化它。
val anonClassMixingInTrait = new MyTrait {
def aFunctionInMyClass = "I'm a func in an anonymous class"
}
是等价的:
class MyClass extends MyTrait {
def aFunctionInMyClass = "I'm a func in a named class"
}
val namedClassMixingInTrait = new MyClass
所不同的是,你只能在instaniate定义的时候,匿名类,因为它没有名字,它不能有构造函数的参数。
史蒂夫鵟已经解释,什么匿名类,但你还要求为宗旨。 这里的目的是,在测试中,你经常有一些默认值,你想在每一个测试中使用。 有时候,你也有状态,可以通过一些测试来改变。 要始终用正确的值开始(测试也可以并行运行),你可以在这些匿名情况下,它们封装。 这个匿名实例中的代码是构造函数,它将在实例化进行评估,从而执行你的测试。
val t = new MyTrait {
val t1 = ... //some expression
val t2 = ... //some expression
}
是相同的
val t = new AnyRef with MyTrait {
val t1 = ... //some expression
val t2 = ... //some expression
}
是相同的
val t = new Object with MyTrait {
val t1 = ... //some expression
val t2 = ... //some expression
}