如何以下特质实例工作大括号?(How does curly braces following tra

2019-09-01 07:30发布

我发现在一些单元测试代码,如一些容易混淆的使用特质:

trait MyTrait {
  val t1 = ... //some expression
  val t2 = ... //some expression
}

然后使用新的,同时一些表达式被大括号包裹,随后实例化实例化特质。

test("it is a test") {
  new MyTrait {
    // do something with t1 and t2
  }
}

我被这个奇怪的语法混淆。

我的问题是:

  1. 为什么使用遵循大括号特质实例?

  2. 是什么特质实例的目的,在这种情况下,和其他案件也可能会有所帮助?

Answer 1:

您还没有实例化特点:本身特质不能被实例化; 只有非抽象类可以。 你在这里做的是使用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定义的时候,匿名类,因为它没有名字,它不能有构造函数的参数。



Answer 2:

史蒂夫鵟已经解释,什么匿名类,但你还要求为宗旨。 这里的目的是,在测试中,你经常有一些默认值,你想在每一个测试中使用。 有时候,你也有状态,可以通过一些测试来改变。 要始终用正确的值开始(测试也可以并行运行),你可以在这些匿名情况下,它们封装。 这个匿名实例中的代码是构造函数,它将在实例化进行评估,从而执行你的测试。



Answer 3:

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
}


文章来源: How does curly braces following trait instantiation work?
标签: scala traits