Scala编译错误:必需:找到未来的[S_2;]字符串

Scala编译错误:必需:找到未来的[S_2;]字符串,scala,future,Scala,Future,下面的函数应该得到一个代码块,执行它并返回future和相应的消息响应。 我得到的编译错误是:Required:Future[S_]Found:String,有人能解释一下原因吗 def withTransaction(blockOfCode: => Future[User])(implicit transaction: Transaction[User]): Future[String] = Future { println("WithTransaction called...")

下面的函数应该得到一个代码块,执行它并返回future和相应的消息响应。 我得到的编译错误是:Required:Future[S_]Found:String,有人能解释一下原因吗

def withTransaction(blockOfCode: => Future[User])(implicit transaction: Transaction[User]): Future[String] = Future {

  println("WithTransaction called...")

  blockOfCode.flatMap(_ => {
    transaction.commit()
    "Success"
  }).recover { // here is the error
    transaction.rollback()
    "Failed"
  }
}
需要一个部分函数

可以用花括号和大小写语法来表示

{ case e => expression }
然而,根据jwvh的评论,由于未使用
e
,我们不妨使用丢弃的参数函数语法

_ => expression
在您的特定情况下,选择哪一种并不重要,但一般来说,分部函数允许您(比如)针对不同类型的错误使用不同类型的恢复机制

{ 
  case e: SocketTimeoutException => // recovery mechanism A 
  case e: ArithmeticException   =>  // recovery mechanism B
  case ...
}
此外,您可能需要
map
而不是
flatMap
,因为您要映射到
“成功”
而不是
未来(“成功”)
。考虑

之间的差异
Future(42).map(_ => "hello")              // ok
Future(42).flatMap(_ => "hello")          // error
Future(42).flatMap(_ => Future("hello"))  // ok
把它放在一起试试

def withTransaction(
  blockOfCode: => Future[User]
)(implicit transaction: Transaction[User]): Future[String] = {
  blockOfCode
    .map { _ =>
      transaction.commit()
      "Success"
    }.recover { _ =>
      transaction.rollback()
      "Failed"
    }
}

我认为最好完全编写所有方法,因为方法开头的
Future
可能会让问题的作者感到困惑。如果
e
未使用,那么
\u=>
就足够了。我现在得到:“必需的:Future[String],找到的:Future[Future[String].”@AmirLasry您是否在
=
符号之后删除了
未来
?让我们来看看。
def withTransaction(
  blockOfCode: => Future[User]
)(implicit transaction: Transaction[User]): Future[String] = {
  blockOfCode
    .map { _ =>
      transaction.commit()
      "Success"
    }.recover { _ =>
      transaction.rollback()
      "Failed"
    }
}