Scala 编译错误 Vert.x 响应未来
Scala compilation error Vert.x response future
我正在尝试从 https://vertx.io/docs/vertx-core/scala/#_the_event_bus_api 复制代码,但出现编译错误。
override def start(): Unit = {
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete {
case Success(result) => {
println("The handler un-registration has reached all nodes")
}
case Failure(cause) => {
println(s"$cause")
}
}
}
我收到这个错误:
missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: scala.util.Try[io.vertx.scala.core.eventbus.Message[?]] => ?
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete {
^
我该如何解决这个问题?
我正在使用 Scala 2.12.8 和 Vert.x 3.7.1
我环顾四周,但没有成功。
感谢提前!
解决方法如下:
所以vertx.eventBus.sendFuture
returns一个Future[Message[T]
。
Future
的 onComplete
方法接受一个参数,它是一个函数 f: (Try[T]) => U
.
你在那里做的是你正在使用一个必须完全声明参数类型的匿名函数。
您需要指定您的f
签名。
我猜有两个选项:
1)
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete { x: Try[Message[_]] =>
x match {
case Success(result) => {
println("The handler un-registration has reached all nodes")
}
case Failure(cause) => {
println(s"$cause")
}
}
}
2)
// define f
def f(x: Try[Message[_]]) = x match {
case Success(result) => {
println("The handler un-registration has reached all nodes")
}
case Failure(cause) => {
println(s"$cause")
}
}
// and later use it
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete(f)
=== 稍加编辑以添加简单的解释 ==
看一下附图:
红色代码实际上是一个没有名字(匿名)的函数体,编译器需要知道它的签名(它的参数和它们的类型)。
这样做 .onComplete { ...
或 .onComplete(f)
是相同的,但如果您在其他地方定义 f
,您已经定义了它的签名。如果没有,你需要这样做 .onComplete { x: Try[Message[_]] => ...
.
(小提醒:在 Scala 中你可以这样定义函数 val double = (i: Int) => { i * 2 }
)
我正在尝试从 https://vertx.io/docs/vertx-core/scala/#_the_event_bus_api 复制代码,但出现编译错误。
override def start(): Unit = {
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete {
case Success(result) => {
println("The handler un-registration has reached all nodes")
}
case Failure(cause) => {
println(s"$cause")
}
}
}
我收到这个错误:
missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: scala.util.Try[io.vertx.scala.core.eventbus.Message[?]] => ?
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete {
^
我该如何解决这个问题?
我正在使用 Scala 2.12.8 和 Vert.x 3.7.1
我环顾四周,但没有成功。
感谢提前!
解决方法如下:
所以vertx.eventBus.sendFuture
returns一个Future[Message[T]
。
Future
的 onComplete
方法接受一个参数,它是一个函数 f: (Try[T]) => U
.
你在那里做的是你正在使用一个必须完全声明参数类型的匿名函数。
您需要指定您的f
签名。
我猜有两个选项:
1)
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete { x: Try[Message[_]] =>
x match {
case Success(result) => {
println("The handler un-registration has reached all nodes")
}
case Failure(cause) => {
println(s"$cause")
}
}
}
2)
// define f
def f(x: Try[Message[_]]) = x match {
case Success(result) => {
println("The handler un-registration has reached all nodes")
}
case Failure(cause) => {
println(s"$cause")
}
}
// and later use it
vertx.eventBus.sendFuture("anAddress", "message 1").onComplete(f)
=== 稍加编辑以添加简单的解释 ==
看一下附图:
红色代码实际上是一个没有名字(匿名)的函数体,编译器需要知道它的签名(它的参数和它们的类型)。
这样做 .onComplete { ...
或 .onComplete(f)
是相同的,但如果您在其他地方定义 f
,您已经定义了它的签名。如果没有,你需要这样做 .onComplete { x: Try[Message[_]] => ...
.
(小提醒:在 Scala 中你可以这样定义函数 val double = (i: Int) => { i * 2 }
)