Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Javaの限界を超えて実用化を目指す
新開発言語「Scala」のメリットとは~補足編

キーワードは手軽さと拡張性

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 Scala(スカラ)というプログラム開発言語をご存知でしょうか。ScalaはJavaの良さを継承し、かつスクリプト言語や関数型言語のメリットを吸収した言語で、Javaの後継を担うものとして注目されています。今回はシリーズの補足編として、Scalaの個性的プログラミングについて解説します。

目次

 本稿は『月刊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などのスクリプト言語に負けない表現力を持たせられると思います。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 株式会社パテントビューロ 三木隆史(ミキ タカフミ)

    株式会社パテントビューロ所属。マネージャー業務と平行して、Webアプリケーション開発、自然言語系の研究開発を行なう。以前はC言語による組込開発。違和感なくScalaへ移行できたことや、ロジック部分に注力できる生産性の高さに驚いている。

  • 株式会社パテントビューロ 木村吉博(キムラ ヨシヒロ)

    政府系研究機関での研究開発を経て、現在、株式会社パテントビューロにて、プログラミング(知財関連文書(SGML/XML)の変換バッチ処理のScalaでの記述など)を担当している。 複雑でイレギュラーな記述も多々見られる大量の文書を相手にする際に、Scalaの書きやすさと高速性とに大いに助けられている...

バックナンバー

連載:新開発言語「Scala」の実体

おすすめ記事

All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5