Давайте упростим это визуально ...
Шаг 1:
Начнем с:
path("api" / "sub" / IntNumber / IntNumber) { (a, b) => sub(a, b) }
def sub(a: Int, b: Int)(request: RequestContext): Future[RouteResult] = ???
Не передавайте явно аргументы,Scala сделает это за вас.
Вот так:
path("api" / "sub" / IntNumber / IntNumber) { (a, b) => sub(a, b) }
Становится так:
path("api" / "sub" / IntNumber / IntNumber) { sub }
Шаг 2:
Поскольку у нас есть это определение:
type Route = RequestContext => Future[RouteResult]
Мы можем заменить эту часть (request: RequestContext): Future[RouteResult]
из sub
метода на Route
.
Так вот:
def sub(a: Int, b: Int)(request: RequestContext): Future[RouteResult] = ???
Становится так:
def sub(a: Int, b: Int): Route = ???
Или, если вы предпочитаете этот стиль:
val sub: (Int, Int) => Route = { (a, b) => ??? }
Пример использования:
path("api" / "sub" / IntNumber / IntNumber) { sub }
def sub(a: Int, b: Int): Route = complete(s"$a / $b")
val sub: (Int, Int) => Route = { (a, b) => complete(s"$a / $b") }
Примечаниечто визуально это выглядит немного проще, но функционально и с точки зрения сигнатур типов в основном то же самое.