【问题标题】:More aesthetic way to instantiate an anonymous implementation of a trait实例化特征的匿名实现的更美观的方式
【发布时间】:2016-03-07 13:58:47
【问题描述】:

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

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) = { ... }
}

【问题讨论】:

  • 另外注意,调用时不需要指定foo[T]的类型参数,因为这会从你传入的MyTrait实例的类型参数推断出来.

标签: scala anonymous-class traits


【解决方案1】:

如果您像您描述的那样在任何地方使用匿名特性,请将其丢弃!
而是让函数看起来像

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

所以你可以这样称呼它

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

【讨论】:

  • 您在此处展示的代码示例使用哪种编程语言编译?
  • 对不起,匆忙做的 :( 更正了 ;)
【解决方案2】:

如果您想保留该特征,Nabil A. 的答案的替代方法是使用将 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 => {...}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多