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に取り込まれます。これには、からの暗黙的な変換 も含まれます。このメソッドは、から持っている標準の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。ただし、lift-jsonは、をに変換できない場合にも例外をスローするJValueためDevice、リクエスト全体をHelper.tryo、try-catch呼び出しをラップして.を返すLiftヘルパーメソッドでラップしましたBoxBox標準のScalaに似ていますOptionが、が追加されています。これは、aが空Failureである理由を示しています。Boxしたがって、この場合、aFull[Device]または。のいずれかを取得しますFailure。ハンディ!

于 2011-06-02T23:27:31.260 に答える