Scala编译错误:必需:找到未来的[S_2;]字符串
下面的函数应该得到一个代码块,执行它并返回future和相应的消息响应。 我得到的编译错误是:Required:Future[S_]Found:String,有人能解释一下原因吗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...")
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"
}
}