7

我正在学习 Scala,并试图了解特征是如何工作的(特别是使用 Dispatch 库)。

我有这样的事情:

import dispatch._
import dispatch.liftjson._

object Foo
{
    def main(cmd: Array[String])
    {
        val http = new Http;
        val req = :/("example.com") / path ># (list ! obj);
        val res = http(req);
    }
}

不幸的是,它抱怨 ># 没有在 dispatch.Request 中注册。该特征在 dispatch.liftjson 中进行了描述,我假设我只需要导入该特征(_ 应该涵盖的)即可注册。

4

1 回答 1

5

您应该从dispatch.liftjson.Js._.

拥有一个特征没有帮助,因为你没有使用它。JS._导入会将对象的所有内容带入JS您的范围,包括它具有的隐式转换 from 。此方法将您拥有的标准 Dispatch 转换为具有方法的。requestToJsonVerbstrait ImplicitJsonVerbsRequest:/("example.com") / pathJsonVerbs>#

这是我如何查询 API 的精简示例:

import dispatch._
import dispatch.liftjson.Js._

import net.liftweb.common.{Box, Failure, Full}
import net.liftweb.util.Helpers

case class Device(device_token: String, alias: Option[String])

val req = devicesReq / device_token as (app_token, secret)
Helpers.tryo(http(req ># (json => {
  json.extract[Device]
})))

如您所见,我有正确的导入(加上一些我喜欢的Lift库),然后我Request“有”一个>#方法。我给出>#了一个与预期签名 ( ) 匹配的函数,(JValue) ⇒ T然后我们就走了。

如果您想知道,我专门使用 lift-json 提取到案例类的能力,这T意味着Device. JValue但是,如果 lift-json 无法将 转换为 a ,它也会引发异常Device,所以我用 包装了我的整个请求Helper.tryo,这是一个包装 try-catch 调用的 Lift 辅助方法,返回 a BoxBox类似于标准的 Scala Option,但添加了Failure,这表明为什么 aBox是空的。所以,在这种情况下,我会得到 aFull[Device]或 a Failure。便利!

于 2011-06-02T23:27:31.260 回答