更美观的方式来实例化特征的匿名实现

More aesthetic way to instantiate an anonymous implementation of a trait

假设我有一个需要特征实例的函数:

trait MyTrait[T] {
  def f1: T
  def f2(t: T): Unit
}

def foo[T](t: MyTrait[T]) { ... }

现在,在我调用此函数的任何地方都需要使用以下语法:

val x = foo[String](new MyTrait[String] {
  def f1 = "Hello"
  def f2(str: String) = { ... }
}

我想知道是否有另一种方法可以使我的用法更简单、更美观?理想情况下,我希望有以下用法:

val x = foo() {
  def f1 = "Hello"
  def f2(str: String) = { ... }
}

如果你像你描述的那样到处使用这个匿名特征,扔掉它!
而是让函数看起来像

def foo[T](f1: T,  f2: T => Unit)  

所以你可以这样称呼它

foo("Hello", (myString:String) =>  { } )

Nabil A. 的答案的另一种选择,如果你想保留这个特征,是使用一个 case class 来 subclass 它需要 f1 和(a函数描述) f2 作为参数:

case class MyClass[T](f1: T, _f2: T => Unit) extends MyTrait[T] {
  def f2(t: T) = _f2(t)
}

然后您可以将其实例化为:

foo(MyClass[String]("hello", str => {...}))