IntelliJ IDEA强调了我的Scala代码含义,但代码有效

时间:2017-02-23 12:48:47

标签: scala intellij-idea akka spray

这是完整的代码:

   package com.example.controller

import spray.routing.{HttpService, Route}
import spray.http.StatusCodes

import scala.util.{Failure, Success}
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

trait RentController extends HttpService{

  var books: List[String] = List("1","2","3","4")

  def rentBook(intNum: Int): Future[Unit] = Future[Unit] {
    val book = books.find(p => p.equals(intNum.toString))
    if(book.head.equals("4")) throw new UnsupportedOperationException()
  }

  def giveBackBook(intNum: Int): String = {
    val book = books.find(p => p.equals(intNum.toString))
    book.head
  }

  val rent: Route =
    pathPrefix("rent") {
      path("book" / IntNumber) { intNum =>
        get {
          onComplete(rentBook(intNum)) {
            case Success(_) => complete(StatusCodes.OK)
            case Failure(_) => complete(StatusCodes.Accepted)
          }
        }
      }
    }

  val giveBack: Route =
    pathPrefix("giveBack") {
      path("book" / IntNumber) { intNum =>
        get {
          onSuccess(Future.successful(giveBackBook(intNum))) {
            extraction: String => complete(extraction)
          }
        }
      }
    }

}

奇怪的是,他只强调OnSuccess,但OnComplete对他来说显然是正确的。代码有效,但我想知道我是否可能在某处犯了一些错误。所以请告诉我是否缺少一些导入,或者只是IntelliJ bug。

修改

我改变了代码,现在函数rendBook和giveBackBook在逻辑上并不正确,并且做得不多,但你应该很容易重现它

1 个答案:

答案 0 :(得分:0)

这是IntelliJ的Scala插件中的a bug - 过度使用implicits可能会让你在那里。如果您了解磁体模式 - 这也是Spray uses,它需要大量的隐式转换来克服Scala中的一些超载限制。

当我使用磁铁模式实现某些功能时,我遇到了这个问题,所以不仅使用Spray - 一些代码加下划线,而其余部分没有,但无论如何都有用。