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では動きがおかしいっぽい。

雑感

extractorは色々と使いでがありそうで、面白いですね。
if文の返り値を使うのは、Erlangでは時折使っていたけれど、Scalaでも出来るのは知らずにいました。色々と基本事項に抜けが多くてよろしくないので、最近買ったコップ本(訳書のタイトルはScalaスケーラブルプログラミング)をさっさと読もうと思います。700ページくらいあるけど。