通常、Scalaシンボルは、常に同じである一意の識別子と考えることができます。字句的に同一であるすべての記号は、まったく同じメモリ空間を指します。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)
最初に行うことは、Dispatch-TwitterモジュールのUserPropsトレイトを拡張してエクストラクタを提供し、そのエクストラクタにアクセスするために使用できるオブジェクトをfriends_count
定義することです。ExtUser
ExtUserPropsはUserPropsを拡張し、これはJsも拡張するため、sym_add_operators
スコープ内のメソッドを取得して、シンボル'friends_count
をSymOpケースクラスに変換します。!
次に、そのSymOpでメソッドを呼び出し、 Extractornum
を渡します。これにより、JSONオブジェクトのプロパティ「friends_count」を検索するExtractorが作成され、返される前に数値として解析されます。そのような小さなコードについては、かなりのことが起こっています。
プログラムの次の部分は、ユーザーのTwitterタイムラインを呼び出し、それを各ステータス項目を表すJsObjectsに解析する理解のためのものです。これらのオブジェクトは、Status.text
抽出機能を適用してステータスメッセージを引き出します。次に、同じことを行ってユーザーを引き出します。次に、ユーザーJsObjectからscreen_nameとfriend_countを引き出し、最後に、探していたすべてのプロパティを含むTuple3を返します。次に、List [Tuple3 [String、String、BigDecimal]]が残ります。これを繰り返して、印刷したり、何でも実行したりできます。
私はそれがいくつかのことをクリアすることを願っています。Dispatchライブラリは非常に表現力豊かですが、Scalaを学んだばかりの人がすぐには得られない多くのScalaトリックを使用しているため、頭を包み込むのは少し難しいかもしれません。ただし、テストとソースコードを確認するだけでなく、プラグインして遊んでみてください。Scalaを使用して強力なDSLを作成する方法がわかります。