当前位置: 首页 > 知识库问答 >
问题:

Scala隐式类必须有一个主构造函数,并且在第一个参数列表中只有一个参数

夹谷志
2023-03-14

大家好,我有这样的问题:

  implicit class mapValue[T](f: Future[T]){
    def mapValue[T]( f: Future[T] )(implicit ec: ExecutionContext): Future[Try[T]] = {
      val prom = Promise[Try[T]]()
      f onComplete prom.success
      prom.future
    }
  
  }

  implicit class traverseFilteringErrors[A, B](seq: Seq[A])(f: A => Future[B]){  // >*It says implicit class must have a primary constructor with exactly one argument in first parameter list here 
    def traverseFilteringErrors[A, B](seq: Seq[A])(f: A => Future[B])(implicit ec: ExecutionContext): Future[Seq[B]] = {
      Future.traverse( seq )( f andThen mapValue ) map ( _ collect{ case Success( x )  => x } )  // >and Type mismatch. Required: Future[B] => NotInferredA, found: Future[Nothing] => mapValue[Nothing] here.
    }

  }

它说:

隐式类必须有一个主构造函数,并且在def traverseFilteringErrors的第一个参数列表中只有一个参数

类型不匹配。必填:Future[B] =

我是新来的scala,所以我应该怎么做来解决这个问题?

共有1个答案

白念
2023-03-14

似乎您正在尝试创建一些扩展方法,但您对语法的工作原理有点困惑。

这个想法是,< code>implicit class将只有一个参数,即您要添加扩展方法的值。但是,你在你的扩展方法的参数中再次复制了那个值,这是没有意义的。< br >您还有其他语法问题,如隐藏泛型参数。

在修复此问题并使用最佳实践(例如使隐式类也对类进行值)之后,我们有几个语法错误可以轻松修复。

最终结果是这样的:

scala prettyprint-override">import scala.concurrent.{ExecutionContext, Future, Promise}
import scala.util.{Try, Success}

object syntax {
  implicit class mapValue[T](private val f: Future[T]) extends AnyVal {
    def mapValue(implicit ec: ExecutionContext): Future[Try[T]] = {
      val prom = Promise[Try[T]]()
      f.onComplete(prom.success)
      prom.future
    }
  }

  implicit class traverseFilteringErrors[A](private val seq: Seq[A]) extends AnyVal {
    def traverseFilteringErrors[B](f: A => Future[B])(implicit ec: ExecutionContext): Future[Seq[B]] = {
      Future
        .traverse(seq)(f.andThen(_.mapValue))
        .map(_.collect { case Success( x )  => x })
    }
  }
}

总的来说,看起来你对这门语言有点陌生,在没有理解基础的情况下尝试一些高级的东西;无论如何,希望这有所帮助。

您可以看到此处正在运行的代码。

 类似资料: