Učím sa Scalu a snažím sa pochopiť, ako vlastnosti fungujú (konkrétne s knižnicou Dispatch).
Mám niečo takéto:
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);
}
}
Bohužiaľ, sťažuje sa, že> # nie jezaregistrované s expedíciou. Táto črta je popísaná v dispatch.liftjson a predpokladal som, že na registráciu by som mal potrebovať iba importovať túto črtu (ktorá by mala obsahovať).
odpovede:
5 pre odpoveď č. 1Mali by ste importovať dispatch.liftjson.Js._
.
Mať črtu nie je užitočné, pretože ju nepoužívate. JS._
import prinesie všetok obsah JS
objekt do svojho rozsahu, vrátane implicitná konverzia requestToJsonVerbs
z ktorého pochádza trait ImplicitJsonVerbs
, Táto metóda prevádza štandardný dispečing Request
, z ktorého pochádzate :/("example.com") / path
, a JsonVerbs
, ktorý má túto metódu >#
.
Tu je skrátená vzorka toho, ako vyhľadávam 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]
})))
Ako vidíte, mám správne dovozy (plus niektoré pre niektoré) Zdvihnite knižnice sa mi páčia) a moje Request
potom „má“ a >#
metóda. ja dávam >#
funkcia, ktorá zodpovedá očakávanému podpisu ((JValue) ⇒ T
) a ideme preč.
V prípade, že vás to zaujíma, používam výslovne schopnosť výťahu do tried prípadov, čo znamená T
bude Device
, Výťah, ale vyvolá tiež výnimku, ak nie je schopný previesť JValue
na a Device
, takže som celú svoju žiadosť zabalil Helper.tryo
, pomocná metóda výťahu, ktorá zalomí pokus o prijatie a vráti znak a Box
. Box
je ako štandardná Scala Option
ale s pridaním Failure
, čo naznačuje, prečo a Box
je prázdny. Takže v tomto prípade dostanem buď Full[Device]
alebo a Failure
, Praktický!