Normalmente, simboli Scala può essere pensato come un identificatore univoco che sarà sempre lo stesso. Ogni simbolo che è identicamente lexi-graficamente si riferisce allo stesso identico spazio di memoria. Non c'è nient'altro di speciale in loro dal punto di vista di Scala.
Tuttavia, Dispatch-Json estrae i simboli rendendoli estrattori di proprietà JSON. Per vedere il codice che è responsabile del pimping, controlla lo SymOp class e il resto del codice JsonExtractor.scala.
Scriviamo po 'di codice che risolve il problema che si sta guardando e poi analizzare quello che sta succedendo:
trait ExtUserProps extends UserProps with Js {
val friends_count = 'friends_count ! num
}
object ExtUser extends ExtUserProps with Js
val good_stuff = for {
item <- http(Status("username").timeline)
msg = Status.text(item)
user = Status.user(item)
screen_name = ExtUser.screen_name(user)
friend_count = ExtUser.friends_count(user)
} yield (screen_name, msg, friend_count)
La prima cosa che stiamo facendo sta estendendo il tratto UserProps nel modulo Dispatch Twitter per dargli un estrattore friends_count
e quindi definire un oggetto ExtUser
che possiamo usare per ottenere l'accesso a tale estrattore. Poiché ExtUserProps estende UserProps, che estende anche Js, otteniamo il metodo sym_add_operators
in ambito che trasforma il nostro simbolo 'friends_count
in una classe di case SymOp. Chiamiamo quindi il metodo su SymOp che passiamo a Extractor num
, che crea un Extractor che cerca una proprietà "account_amici" su un oggetto JSON e poi lo analizza come numero prima di tornare. Un po 'andando avanti per un po' di codice.
La parte successiva del programma è solo un per-comprensione che chiama fuori per la timeline di Twitter per un utente e lo analizza in JSObject che rappresentano ogni elemento dello stato, li applichiamo l'estrattore Status.text
per tirare fuori il messaggio di stato. Quindi facciamo lo stesso per estrarre l'utente. Quindi estraiamo screen_name e friend_count dall'utente JsObject e alla fine restituiamo un Tuple3 con tutte le proprietà che stavamo cercando. Rimaniamo quindi con un elenco [Tuple3 [String, String, BigDecimal]] che è possibile quindi iterare per stampare o fare qualsiasi cosa con.
Spero che chiarisca alcune cose. La libreria di Dispatch è molto espressiva, ma può essere un po 'difficile da comprendere, poiché utilizza un sacco di trucchi Scala che qualcuno che ha appena imparato Scala non otterrà subito. Ma continua a collegare e giocare, oltre a guardare i test e il codice sorgente, e vedrai come creare potenti DSL usando Scala.
La risposta dipende * interamente * dalla libreria/API che stai utilizzando, ma non l'hai specificato. –
sto usando la libreria HTTP di dispatch di scala .. –