Scalaコップの会第10回やりました
7月13日(火)にScalaコップの会第10回をやりました。
すっごいどうでもいい話なんですが、第0回からやってて回数カウントが10回=11回目なんですよね。
次回から実際の回数に修正しちゃおうかなと考えてます。
で、やった内容。
yuroyoroさんのWebベースのTwitterクライアントを写経して、コードリーディングして・・・終わりましたw
改良する時間がなかったです。
コードリーディングでかみ砕くのに時間がかかって、うぉー、Scala力足りてないみたいな。
実際につっかかった所をさらしてみる。
- Stream.continuallyをAPIから見つけられずに右往左往→Scala2.8で、でもってclassじゃなくobjectだったorz
- ( "" /: str){ (s,c) => ..... てなfoldLeftを読み解けず固まる→Rubyでいったらinjectに置き換えて考えればわかる事だったのに気づくのにしばらくかかった。というかコップ本読んだときに理解したつもりだったのに忘れてる・・・。
- ワイルドパターンでしばし固まる
val m = Map( data split('&') map{ _.split('=') match { case Array(k,v) => (k,v)}} : _* )
_*ってなんぞこれ状態。Scala勉強会@東北でレクチャーいただいた内容を思い出して読み解きました。ばらばらに分解していくと・・
//再現用にdataのストリングを用意。 scala> val data="username=katahirado&password=pass" data: java.lang.String = username=katahirado&password=pass //splitして・・ scala> val data1 = data.split('&') data1: Array[String] = Array(username=katahirado, password=pass) //mapしてsplitなやつに対してパターンマッチして、二要素のタプルが要素になってるArrayが生成される。 scala> val data2 = data1.map { _.split('=') match { case Array(k,v)=>(k,v)}} data2: Array[(String, String)] = Array((username,katahirado), (password,pass)) //タプル2が要素になってるArrayを突っ込んでMapを生成。 scala> Map(data2: _*) res9: scala.collection.immutable.Map[String,String] = Map((username,katahirado), (password,pass)) //可変長のワイルドパターンを外すとエラー scala> Map(data2) <console>:9: error: type mismatch; found : Array[(String, String)] required: (?, ?) Map(data2) ^*)
//ちなみにMap生成時に二要素のタプル渡して生成できるというのが前提にある話だよ scala> Map((2,3)) res4: scala.collection.immutable.Map[Int,Int] = Map(2 -> 3)
- m.get("username") foreach { u => m.get("passwd") foreach { p => ....}でも固まる。なんでgetからforeachとつなげていけるの?→APIのMapのgetのとこみてとりあえず納得。"Check if this map maps key to a value and return the value if it exists."
で、改良するにはWebSocketの仕様だとか前提に色々必要で、今の我々には少々荷が重いのではないかという事になりました。
なので、次回以降は、もっと粒度の小さいコードを読み書き、改良していこうという事になりました。
それにしても、今回改めて思いましたが、やはり日常的に読み書きしてないと駄目ですね(当たり前)。一ヶ月に一回だとわすれてます。
日々もっとScalaときゃっきゃうふふするように精進したいと思います。
参加の皆様ありがとうございました&お疲れ様でした。
次回以降も宜しくお願いします。