2016-11-01 3 views
1

Я читаю исходные коды akka-http, вот исходный код akka.http.scaladsl.server.directives.RouteDirectives, возьмите метод complete в качестве примера, может ли кто-нибудь сказать, что означает подчеркивание в StandardRoute(_.complete(m))?В чем смысл этого подчеркивания?

package akka.http.scaladsl.server 
package directives 

import akka.http.scaladsl.marshalling.ToResponseMarshallable 
import akka.http.scaladsl.model._ 
import StatusCodes._ 

/** 
* @groupname route Route directives 
* @groupprio route 200 
*/ 
trait RouteDirectives { 

    .... 
    .... 

    /** 
    * Completes the request using the given arguments. 
    * 
    * @group route 
    */ 
    def complete(m: ⇒ ToResponseMarshallable): StandardRoute = 
    StandardRoute(_.complete(m)) 
} 

object RouteDirectives extends RouteDirectives { 
    private val _reject = StandardRoute(_.reject()) 
} 

ответ

2

StandardRoute(_.complete(m)) эквивалентно StandardRoute(x => x.complete(m))

Здесь подчеркивание относится к x. Если вы хотите узнать примеры использования подчеркивания в scala. Пожалуйста, проверьте this link (Uses of underscore in Scala)

Вот код из Акки HTTP библиотеки

object StandardRoute { 
    def apply(route: Route): StandardRoute = route match { 
    case x: StandardRoute ⇒ x 
    case x    ⇒ new StandardRoute { def apply(ctx: RequestContext) = x(ctx) } 
    } 

    /** 
    * Converts the StandardRoute into a directive that never passes the request to its inner route 
    * (and always returns its underlying route). 
    */ 
    implicit def toDirective[L: Tuple](route: StandardRoute): Directive[L] = 
    Directive[L] { _ ⇒ route } 
} 

Маршрут не что иное, как функция

type Route = RequestContext ⇒ Future[RouteResult] 

Объяснение:

Рассмотрим этот номер объекта. Метод применения этого объекта принимает функцию. Теперь посмотрим, как будет использоваться этот объект Number.

object Number { 
def apply(f: String => Int): Int = { 
    f("123") 
} 
} 

Использование:

Number(_.toInt) 

или

Number(x => x.toInt) 

Scala РЕПЛ

scala> object Number { 
    |  def apply(f: String => Int): Int = { 
    |  f("123") 
    |  } 
    |  } 
defined object Number 

scala> Number(_.toInt) 
res0: Int = 123 

scala> Number(x => x.toInt) 
res1: Int = 123 
+0

Нету, метод применяется в StandardRoute только принимает экземпляр маршрута. –

+0

Маршрут @LaurenceGeng должен расширять функцию, тогда – pamu

+0

@LaurenceGeng 'StandardRoute (_. Complete (m))' может быть заменен на 'StandardRoute (x => x.complete (m))' – pamu

 Смежные вопросы

  • Нет связанных вопросов^_^