5

friends_countの値を抽出するにはどうすればよいですか。screen_nameがStatusオブジェクトとcaseクラスですでに定義されていることに気づきました。JsまたはJsObjectを別の方法で拡張する必要がありますか

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

次に、以下に示すように、JsObjectのリスト内の各jsonオブジェクトに対してパターンマッチングします。記号は紛らわしいです:

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)

}

4

1 に答える 1

6

通常、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定義することです。ExtUserExtUserPropsは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を作成する方法がわかります。

于 2010-09-26T12:54:12.773 に答える