更美观的方式来实例化特征的匿名实现
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 => {...}))
假设我有一个需要特征实例的函数:
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 => {...}))