Scala勉強会第78回 in 秋葉原 #rpscala 参加してきた
この勉強会には2回目の参加です。平日の勉強会は、ライブと被らないので良いですね。
PARTAKE:partake.in
概要
初心者コーナー (Scala School)
Basicsの項目が終了。
終盤に突如コードブロックとして出てくる type parameter ってなんじゃい!という話が出ましたが、もしかすると短縮記法の誤爆か何かによってマークアップを間違えただけなのかも?
- if式が値を返す
val hoge = if ... みたいな書き方が可能。三項演算子は存在しない。
- traitはコンストラクタを持てない
クラスなら出来るんだけど。そういうことをしたければ抽象メンバーを使う。そうすると初期化問題に気を付けないといけない。
(このあたりの話?→ほとんど使われていないマニアックな機能「事前定義 (Early Definitions)」- Scala Advent Calendar jp 2011 Day 5 - ( ꒪⌓꒪) ゆるよろ日記)
Traitは、基本的には書いた順の後方から評価される。
パターンマッチ
matchはネストできるので、例えばOption[Option[String]]に対して、case Some(Some("hoge"))みたいな捕まえ方が出来る。
Extractor
unapplyメソッドを持つObjectのことをExtractorというらしい。Optionを返す。case文に使えて、Someを返した場合にマッチ。
match以外では、変数定義に使える。でも、マッチしないと例外が飛ぶ。tupleとか正規表現とかでいい感じに活用されているらしい。ついでに、Listの :: もExtractor。
scala> val (a, b) = (1, 2) a: Int = 1 b: Int = 2
scala> val mail = "(.+?)@(.+)".r mail: scala.util.matching.Regex = (.+?)@(.+) scala> val mail(user, domain) = "hoge@apple.com" user: String = hoge domain: String = apple.com scala> val mail(user, domain) = "hogeapple.com" scala.MatchError: hogeapple.com (of class java.lang.String)
HTTPツールキットであるunfilteredは、extractorのいいサンプルらしい。request処理のあたりは、ひたすらExtractorを書いている。
その他
- sealed
スコープがファイル内になるので、ユーザーが勝手に継承できない。(つまりそこに定義してあるものが全てなので…多分、)パターンマッチに使うとコンパイラがパターン網羅のチェックをしてくれる。
でもREPLでは動きがおかしいっぽい。