url
là (về cơ bản) một phương thức trả về đối tượng Req
.Vì vậy, request
có loại Req
.
Http
là một lớp có đối tượng đồng hành có quá tải một số phương thức apply
. Vì vậy, khi bạn nhìn thấy:
Http(request OK as.String)
Đó là đường thực sự cú pháp cho:
Http.apply(request OK as.String)
Ok, vì vậy những gì đang xảy ra bên trong apply
? Dường như phương thức có tên là OK
đang được gọi trên request
. Nhưng nhìn qua API Docs, bạn có thể nhận thấy không có phương pháp như vậy OK
cho loại Req
.Tuy nhiên, có một lớp được gọi là RequestHandlerTupleBuilder
, có một phương thức như vậy. Và có một chuyển đổi ngầm định nghĩa trong gói dispatch
:
implicit def implyRequestHandlerTuple(builder: Req) =
new RequestHandlerTupleBuilder(builder)
gì đang xảy ra ở đây là khi bạn gọi request OK
, trình biên dịch thấy rằng request
không có một phương pháp OK
. Vì vậy, nó sẽ tìm kiếm các phương thức tiềm ẩn có thể chấp nhận Req
như một tham số và các kiểu trả về để thực hiện một phương thức như vậy. Phương pháp trên là ngầm nó tìm thấy, do đó, Req
được chuyển đổi hoàn toàn thành RequestHandlerTupleBuilder
.
Bây giờ chúng ta hãy nhìn vào chữ ký của OK
:
def OK [T](f: Response => T): (Request, OkFunctionHandler[T])
Nó chấp nhận một chức năng như một tham số. Cụ thể, một hàm chấp nhận thông số Response
và trả về một số loại khác T
. Trong trường hợp này, một hàm như vậy là as.String
có loại Response => String
. OK
sau đó sẽ trả lại một Request
tupled với một OkFunctionHandler[T]
.
này nói với tôi rằng sự quá tải của apply
chúng tôi đang gọi điện thoại này là một:
def apply[T](pair: (Request, AsyncHandler[T])): Future[T]
(OkFunctionHandler
kéo dài AsyncHandler
)
Nhìn nó tất cả trong một phong cách java giống như hơi hơn và với loại chú thích, bạn có:
val request: Req = url("http://somesite.com")
val result: Future[String] = Http.apply(request.OK(as.String))
Chỉ sử dụng các cuộc gọi rõ ràng, nó trông giống như sau:
val result: Future[String] =
Http.apply(implyRequestHandlerTuple(request).OK(as.String))
Tóm lại, chỉ có một thông số được chuyển đến Http.apply
, nó chỉ sử dụng kiểu không có điểm để gọi các phương thức khác bên trong.
Ồ, xin lỗi. Đó là trong Scala dành cho các nhà phát triển Java, mà tôi đang đọc qua, nhưng tôi cũng đã thấy các ví dụ tương tự trực tuyến; ví dụ. http://stackoverflow.com/questions/21103553/scala-dispatch-simple-get-request và thậm chí trên trang web Công văn: http://dispatch.databinder.net/Dispatch.html –