2010-09-22 25 views
5

Arkadaşlar_ için değer ayıklamak için ne yapmam gerekiyor. Screen_name'ın zaten Durum nesnesinde ve vaka sınıfında tanımlandığını fark ettim. Aşağıda gösterilen hala gerektirir musunuz JsObjects listesinde her json nesnesi karşı Js veya JSObject farklıdispatch.json.JsObject adresinden ayıklamak için nasıl olabilir

object TweetDetails extends Js { val friends_count = 'friends_count ? num } 

ve sonra desen maçı da genişletir. semboller kafa karıştırıcı:

scala> val friends_count = 'friends_count ! num // I wish SO understood Scala's symbols 
val twtJsonList = http(Status("username").timeline) 
twtJsonList foreach { 
     js => 
     val Status.user.screen_name(screen_name) = js 
     val Status.text(text) = js 
     val friends_counts(friends_count) = js //i cannot figure out how to extract this 
     println(friends_count) 
     println(screen_name) 
     println(text) 

} Normal olarak, Scala semboller her zaman aynı olacaktır benzersiz bir tanımlayıcı olarak düşünülebilir

+0

Yanıt, kullandığınız kitaplık/API'daki * tamamen * * bağlıdır, ancak bunu belirlemediniz. –

+0

Scala'nın gönderim HTTP kütüphanesini kullanıyorum. –

cevap

6

. Sözcüksel olarak aynı olan her sembol, aynı bellek alanına karşılık gelir. Scala'nın bakış açılarından özel bir şey yok. Ancak, Dispatch-Json, JSON mülk çıkarıcıları yapan sembolleri dışarı çıkarır. Taklit etmekle sorumlu olan kodu görmek için SymOp class ve JsonExtractor.scala kodunun kalanını kontrol edin.

en bakıyorsun sorunu çözer bazı kodlar yazalım ve sonra neler olduğunu analiz:

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) 

biz Sevk-Heyecan modülünde UserProps özelliği eklenerek genişletilmiştir yapıyoruz ilk şey friends_count ekstrüderi verin ve daha sonra bu çıkarıcıya erişmek için kullanabileceğimiz bir ExtUser nesnesini tanımlayın. ExtUserProps, Js'yi de genişleten UserProps'ı genişletdiğinden, 'friends_count sembolümüzü bir SymOp case sınıfına dönüştüren sym_add_operators metodunu elde ederiz. Ardından, daha sonra Extractor num ürününü ilettiğimiz SymOp üzerinde yöntemini çağırırız; bu, bir JSON nesnesinde "friends_count" özelliğini arayan bir Extractor oluşturan ve sonra döndürmeden önce bir sayı olarak ayrıştırılan bir Extractor oluşturur. Oldukça küçük bir kod için oraya gidiyor.

Programın bir sonraki kısmı, bir kullanıcı için Twitter zaman çizelgesini çağıran ve her bir durum öğesini temsil eden JsObjects'a ayrıştıran bir kavramadır. Durum mesajını çekmek için Status.text çıkarıcıyı uygularız. Sonra kullanıcıyı çekmek için aynısını yaparız. Daha sonra ekran_adını ve friend_count'u JsObject kullanıcısından çıkarırız ve sonunda aradığımız tüm özelliklerle bir Tuple3 geri veririz. Daha sonra bir Listeyi [Tuple3 [String, String, BigDecimal]] ile bıraktık, daha sonra yazdırmak veya her şeyi yapmak için yineleyebilirsiniz.

Umarım bazı şeyleri temizler. Dispatch kütüphanesi çok etkileyici ancak Scala'yı öğrenmeyi başaramayan bir çok Scala hilesi kullandığı için kafanızı sarmak biraz zor olabilir. Ancak, testlere ve kaynak kodlara bakmanın yanı sıra, etrafa takılıp oynatmaya devam edin ve Scala'yı kullanarak güçlü DSL'lerin nasıl oluşturulacağını göreceksiniz.