本稿は『月刊DBマガジン 2009/09月号』の記事「Javaの限界を超えて実用化を目指す、新開発言語「Scala」のメリットとは」を転載し、一部修正したものです。
はじめに
シリーズ前編・後編を通して、Scalaのメリットや、基本的な文法、コンパイルや、データベース接続について説明しました。シリーズ最後となる今回も、Javaの後継を担うものとして注目されているプログラム開発言語「Scala」について説明していきます。
今回はシリーズの補足編として、Scalaの個性的プログラミングについて解説します。
これまでの連載
Scalaの個性的プログラミングを体験しよう
以下では、Lisp、ML、Haskellなどの関数型言語が発展させてきたプログラミング手法が、Scalaにどのように導入されているかを見ていきましょう。パターンマッチ、case class、型推論というjavaには見られない機能を取り上げることとします。
case classを使ってデータをひとまとめにして扱う
ArrayやListは、データ要素として、ユーザー定義クラスを持つことができます。Scalaでは、比較的簡単なデータは、case classというものを使ってまとめることができます。case classは、次のように宣言します。
scala> case class Point (x:Int, y:Int) defined class Point
冒頭にcaseと書いてある以外は、普通のクラス定義と同じです。case classの特徴の1つは、オブジェクト生成時にnew
キーワードが不要であることです。
scala> val p =Point(1,2) p: Point = Point(1,2)
プロパティへは「.
」を使ってアクセスします。
scala> p.x res: Int = 1 scala> p.y res: Int = 2
また、toString
メソッドがはじめから定義されているのも特徴です。
scala> print (p) Point(1,2)
では、case classを配列で扱ってみましょう。本のタイトル(title
)とその値段を管理するcase classを以下のように定義します。定価(price
)は変更不可(val
)ですが、値引率(discount_rate
)を変更可能(var
)としています。
scala> case class book ( val title:String, val price : Int , var discount_rate: Double) { | def currentPrice = (price * (1-discount_rate)).toInt | override def toString = { | if (discount_rate > 0) { | "%sの値段は、%d円です [定価%d円より、%2.2f%の割引]". | format(title,currentPrice, price, discount_rate * 100) | } else { | "%sの値段は、%d円です[定価販売中]".format(title,currentPrice) | } | } | } defined class book
少し分かりにくいので、エディタ上の画面も掲げておきます。
現在価格を示すcurrentPrice
メソッド、および、本の価格を示すtoString
メソッドが定義されています(case classでtoString
メソッドを定義しなおす際には、overrideキーワードをつけます)。
では、このbookクラスを配列で宣言してみましょう。
scala> val initArr = Array( | book("book1", 3000,0), | book("book2",2000,0), | book("book3",1000,0) | ) initArr: Array[book] = Array(book1の値段は、3000円です[定価販売中], book2の値段は、2000円です[定価販売中], book3の値段は、1000円です[定価販売中])
宣言結果に、さっそくtoString
メソッドを拡張した結果が反映されているのが分かります。
では、1冊目の本を値引いてみましょう。
scala> initArr(0) .discount_rate = 0.3
3,000円の本を3割引したので、以下のようになります。
scala> initArr(0).currentPrice res9: Int = 2100
一覧を表示させてみましょう。
scala> initArr.foreach (println _) book1の値段は、2100円です [定価3000円より、30.00%の割引] book2の値段は、2000円です[定価販売中] book3の値段は、1000円です[定価販売中]
case classを使うことによって、柔軟なデータの取り扱いができます。一工夫をすると、RubyやPythonなどのスクリプト言語に負けない表現力を持たせられると思います。