Scala 一种更美观的方法来实例化trait的匿名实现

Scala 一种更美观的方法来实例化trait的匿名实现,scala,anonymous-class,traits,Scala,Anonymous Class,Traits,假设我有一个函数需要一个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) = { ... } } 我想知道是否有其他方法可以让我的

假设我有一个函数需要一个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) =>  { } )

如果你在任何地方都像你描述的那样使用这种特性,扔掉它
而是使函数看起来像

def foo[T](f1: T,  f2: T => Unit)  
所以你可以这样称呼它

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

如果你想保留这个特征,Nabil A.回答的另一个选择是使用一个case类对其进行子类化,该类将
f1
和(一个描述
f2
的函数)作为参数:

case class MyClass[T](f1: T, _f2: T => Unit) extends MyTrait[T] {
  def f2(t: T) = _f2(t)
}
然后可以将其实例化为:

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

如果你想保留这个特征,Nabil A.回答的另一个选择是使用一个case类对其进行子类化,该类将
f1
和(一个描述
f2
的函数)作为参数:

case class MyClass[T](f1: T, _f2: T => Unit) extends MyTrait[T] {
  def f2(t: T) = _f2(t)
}
然后可以将其实例化为:

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

还请注意,调用时不需要指定
foo[t]
的类型参数,因为这将从传入的
MyTrait
实例的类型参数中推断出来。还请注意,调用时不需要指定
foo[t]
的类型参数,因为这将从您传入的
MyTrait
实例的类型参数中推断出来。您在这里展示的代码示例是用哪种编程语言编译的?抱歉,是匆忙完成的:(更正;)您在这里展示的代码示例是用哪种编程语言编译的?抱歉,是匆忙完成的:(更正;)