Обычно символы Scala можно рассматривать как уникальный идентификатор, который всегда будет одинаковым. Каждый символ, который лексикографически идентичен, относится к одному и тому же пространству памяти. С точки зрения Скалы, в них нет ничего особенного.
Однако Dispatch-Json выводит символы, превращая их в экстракторы свойств JSON. Чтобы увидеть код, отвечающий за сутенерство, проверьте класс SymOp и остальную часть кода JsonExtractor.scala.
Давайте напишем некоторый код, который решает проблему, которую вы смотрите, а затем проанализируете, что происходит:
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)
Первое, что мы делаем, - это расширяем черту UserProps в модуле Dispatch-Twitter, чтобы дать ему экстрактор friends_count
, а затем определяем объект ExtUser
, который мы можем использовать для получения доступа к этому экстрактору. Поскольку ExtUserProps расширяет UserProps, который также расширяет Js, мы получаем метод sym_add_operators
в области видимости, который превращает наш символ 'friends_count
в класс case SymOp. Затем мы вызываем метод !
для этого SymOp, который затем передаем Extractor num
, который создает Extractor, который ищет свойство friends_count для объекта JSON а затем анализирует его как число, прежде чем вернуться. Для такого небольшого фрагмента кода происходит довольно много.
Следующая часть программы - это просто для понимания, которое вызывает для пользователя временную шкалу Twitter и разбирает ее на JsObjects, которые представляют каждый элемент статуса, а затем мы применяем экстрактор Status.text
для извлечения сообщения о состоянии. , Затем мы делаем то же самое, чтобы вытащить пользователя. Затем мы извлекаем screen_name и friend_count из пользовательского JsObject и, наконец, возвращаем Tuple3 со всеми свойствами, которые мы искали. Затем у нас остаётся список [Tuple3 [String, String, BigDecimal]], который можно затем перебрать, чтобы распечатать или сделать с ним что угодно.
Надеюсь, это прояснит некоторые вещи. Библиотека Dispatch очень выразительна, но она может быть немного сложной, чтобы обернуть вашу голову, поскольку она использует множество трюков Scala, которые кто-то, только изучающий Scala, не получит сразу. Но продолжайте подключаться и играть, а также смотреть на тесты и исходный код, и вы увидите, как создавать мощные DSL с использованием Scala.