【新・言語進化論】次にくる!新登場言語
第3回:オブジェクト指向と関数型を兼ね備えた「Scala」
著者: ether
公開日:2007/11/19(月)
RubyとScalaの比較
最後にScalaとRubyとの比較を行う。「Rubyらしい」特徴を3つ取り上げ、それらをScalaと比較してみたい。
Java初心者が感じる至極まっとうな疑問の1つに「何故 Date d = new Date(); のような文で左右に同じ型を書く必要があるのか」というものがある。Rubyでは変数に型は書かずに「d = Time.new」とすればよい。これはRubyが動的型付けであり、変数が特定の型と結び付いていないためだ。
一方Scalaでは別の理由により変数の型を省略できる(「val d = new Date」)。これはScalaコンパイラが「型推論」を行い、変数の型を自分で補うためだ。したがってコンパイラが型を推論できる箇所では型を省略できるのだ。
Rubyはオブジェクトの型付けに「ダックタイピング」と呼ばれる方法を使う。これは型付けを継承関係によらず、単に特定のメソッドを実装しているかどうかで判断することだ。Rubyでリスト4のメソッドの引数xはclosed?とcloseの2つのメソッドを実装さえしていれば何でもよい。
一方Scalaで書いたリスト5ではコンパイラに「xはisClosedとcloseを実装している型なら何でもよい」とだけ指示している。これを structural subtypingと呼ぶ。Rubyと異なり条件に適合しない型がコンパイル時にきちんとチェックされる。
「メソッドの後付け」は恐らく最もRubyらしい特徴かもしれない。Rubyの「20.minutes」という式を考えよう。素のRubyのFixnumクラスにminutesはないが、もし「後付け」でminutesメソッドを定義していればこのコードは通る。これをオープンクラスという。
一方Scalaコンパイラは上記の式をみると「Intクラスにminutesメソッドはない。だがもしIntから暗黙に変換できるクラスにminutesメソッドがあれば型変換のコードを挿入してコンパイルを通そう」と考える。
そしてScalaでは暗黙の型変換をユーザ定義できるので、Intからminutesメソッドを定義したクラスへの暗黙の型変換を定義しておけばよい。しかもこれはIntクラスの書き換えではないため、Intクラスを使う他のコードに影響はない。
(画像をクリックすると別ウィンドウに拡大図を表示します)
まとめ
これらを踏まえてScalaが依然として静的型付け言語であるということを思い出してほしい。「動的言語の特徴のように見える物」が、実はそうでもないことがみえてくるのではないだろうか。実際Scalaを学んでいくと「型安全性と実行効率を引き換えに記述性と柔軟性を手に入れる」という「動的言語の常識」が覆されていくような感覚すら覚えるほどだ。
読者もScalaに触れることでプログラミング言語を新しい視点で捉え直してみては如何だろうか。
11月26日に公開する最終回では、信頼性のある並列プログラミング機能を持つ関数型言語「Erlang」をとりあげる。 タイトルへ戻る