Scala调度示例

Dav*_*ler 12 scala

我是一名Java工程师,他最近一直在慢慢学习Scala.我发现了一些使用Dispatch的示例代码来制作一个简单的GET请求:

val request = url("http://somesite.com")
val result = Http( request OK as.String)
Run Code Online (Sandbox Code Playgroud)

问题是......我不太明白这里发生了什么.首先,是Http一类?还是一种方法?第二,传递给它的参数是什么?我想也许我们传递了三个参数,Scala允许我们省略逗号.但是当我尝试添加逗号时,我遇到了编译错误,所以这不可能是正确的.

我确信这对于精通Scala的人来说是有道理的,但我还没有,而且它阻止了我.我曾尝试在线查找文档,但没有发现任何有用的信息.

Tra*_*own 26

这是一个(痛苦的)显式版本,取出了所有的语法糖:

import dispatch.{ Defaults, Http, Req, as, implyRequestHandlerTuple, url }
import scala.concurrent.Future

val request: Req = url.apply("http://somesite.com")

val result: Future[String] =
  Http.apply(
    implyRequestHandlerTuple(request).OK[String](as.String)
  )(Defaults.executor)
Run Code Online (Sandbox Code Playgroud)

url是一个单例对象,带有一个apply返回Reqcase类实例的方法.Http也是一个单例对象,它也有一个apply方法.Http我们apply需要两个参数列表 - 第一个采用单个Req参数,第二个采用执行上下文(您可以将其视为Scala的Java版本Executor).

implyRequestHandlerTuple是一种隐含的方法.Req没有OK方法,但编译器知道RequestHandlerTupleBuilder该类(并且它采用适当的参数 - 在这种情况下是一个函数从Response某种类型),因此在原始版本中它自动应用此方法来进行转换Req.

最后,as是一个包含String单个对象的包.这个对象扩展了Response => String(这是更多的语法糖Function1[Response, String].我们的OK方法是寻找一个函数Response,因此我们在那里很好.

最后你有一个Future[String].还有很多其他地方可以阅读关于期货的信息,所以我不会在这里详细介绍,但简而言之,这个价值要么不满足(即你还在等待结果),要么对失败感到满意(以防万一)网络错误等),或成功满足(在这种情况下,它将包含响应主体).

  • 也许你提前12秒开始,或者你知道要遗漏哪些话.你的人文教育美元在工作.在她开始下一本书的报告之前,我打算让我的女儿读完这个答案.我看到你使用罗伯茨女士推荐的过渡词:"最后","最后".请加! (5认同)

Mic*_*jac 9

url(基本上)是一个返回Req对象的方法.所以request有类型Req.

Http是一个具有伴随对象的类,该apply方法具有一些重载.所以当你看到:

Http(request OK as.String)
Run Code Online (Sandbox Code Playgroud)

它实际上是语法糖:

Http.apply(request OK as.String)
Run Code Online (Sandbox Code Playgroud)

好的,那里面发生了apply什么?似乎OK正在调用名为的方法request.但是查看API文档,您可能会注意到OK该类型没有这种方法Req.但是,有一个叫做的类RequestHandlerTupleBuilder,它确实有这样的方法.并且dispatch包中定义了隐式转换:

implicit def implyRequestHandlerTuple(builder: Req) =
    new RequestHandlerTupleBuilder(builder)
Run Code Online (Sandbox Code Playgroud)

这里发生的是当你调用时request OK,编译器看到request没有OK方法.因此,它会查找可能的隐式方法,这些方法接受Req作为参数,并返回类型以实现这样的方法.上面的方法是它找到的隐式,因此Req隐式转换为a RequestHandlerTupleBuilder.

现在让我们来看看签名OK:

def OK [T](f: Response => T): (Request, OkFunctionHandler[T])
Run Code Online (Sandbox Code Playgroud)

它接受一个函数作为参数.特别是,一个接受a Response作为参数的函数,并返回一些其他类型T.在这种情况下,这样的功能是as.String具有类型的Response => String.OK然后将返回一个Request带有一个tupled OkFunctionHandler[T].

这告诉我,apply我们调用的重载是这样的:

def apply[T](pair: (Request, AsyncHandler[T])): Future[T]
Run Code Online (Sandbox Code Playgroud)

(OkFunctionHandler延伸AsyncHandler)

通过稍微类似Java的样式和类型注释来查看所有内容,您可以:

val request: Req = url("http://somesite.com")
val result: Future[String] = Http.apply(request.OK(as.String))
Run Code Online (Sandbox Code Playgroud)

仅使用显式调用,它看起来更像:

val result: Future[String] = 
    Http.apply(implyRequestHandlerTuple(request).OK(as.String))
Run Code Online (Sandbox Code Playgroud)

简而言之,只传递了一个参数Http.apply,它只是使用无点样式来调用其他方法.