scalaのDSLの片鱗に触れる。(第9章から第14章)
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 109回
- この商品を含むブログ (28件) を見る
Javaで手が届かないかゆいところに手が届く感はやっぱり素晴らしい。
例えば、第13章では公開と非公開の話。protectedとメンバーにつけた場合、Javaだとパッケージ内から見れば丸見えになる。でも、Scalaはデフォルトが継承しないと公開されない。「デフォルトでは」なので、protected[ABC]とABCにパッケージ名を記入すればJavaのようにパッケージ内から丸見えにできる。
読み始めて二週間、上の例もそうだけど、色んな書き方ができる素晴らしさをひしひしと感じる。
Scalaってこんな書き方ができるのね、と感心することが多い。
今回感心したのはScalaのDSLの部分。
第14章でアサーションと単体テストの説明があるんですが、振る舞い駆動開発の例を紹介します。
JavaでもJUnitとかありますが、Scalaも沢山単体テストの方法があります。
その内の一つがScalatestです。
Scalatestは以下のように書きます。
import org.scalatest.FlatSpec import org.scalatest.matchers.ShouldMatchers class StringShouldSuite extends FlatSpec with ShouldMatchers { "ABC" should "have an A " in { "ABC" contains "A" should be (true) } "ABC" should "not have a X " in { "ABC" contains "X" should be (false) } } (new StringShouldSuite).execute()
なんというか、普通の英文法で書いているみたいな自然さ。
Scalaのコンパイラはかなりアグレッシブなことがわかります。
"ABC" contains "A" should be (true)
shouldやcontainsはScalaの文法のように見えますが、単なる関数です。
ScalaではJavaのように obj.method(arg) とも書けますが、
obj method argとも書けます。
逆に言うと、 1 + 1 のような普通の構文も実は Int型クラスの "+"という関数を呼んでいるだけです。
この辺りに言語実装者の拘りというか、アグレッシブさが見えます。
次回以降も面白そうです。