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.sendFuturereturns一个Future[Message[T]FutureonComplete 方法接受一个参数,它是一个函数 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 }