Scala

Scalaのアクセッサとミューテータによる仮想publicフィールドの作成

以下の表記にてミューテータが定義できる。 def _=() 実装例 package AbsoluteNumberDemo class AbsoluteNumber(num:Int) { private var _value = Math.abs(num) def value = _value // "getter" method def value_=(num:Int) = _value = Math.abs(num) // "…

プライマリコンストラクタ

Scalaではオブジェクトのコンストラクタをクラス定義自身として記述できる class ImmutableFoo(val value:Int) class MutableFoo(var value:Int) object Main extends Application { val immutable = new ImmutableFoo(54) val mutable = new MutableFoo(32)…

Scalaでの型エイリアス

Scalaでは型にエイリアスを使用して扱うことができます。 package TypeAliasDemo object Main extends Application { type ArrayOfIntArrays = Array[Array[Int]] var arrs : ArrayOfIntArrays = Array(Array(1,2,3), Array(4,5,6), Array(7,8,9)) printf("a…

Scalaのパッケージ管理システム sbazとは

Scala Bazaar Systemとは Scala Bazaar System、略してsbazはScalaの提供するパッケージ管理システム。新しいプログラムのインストールやアップグレードを自動化でき、パッケージの配布を容易にする。CPANやaptみたいな感じ Scalaのインストール 念のため、S…

ローンパターンでリソースのクローズを確実に

ローンパターン Scalaでは関数をオブジェクトとして扱えるため、以下のような関数を考えることができる def withWriter(filename: String)(op: Writer => Unit) { val writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(filename),…

Scalaによる正規表現

正規表現の記述 Scalaで正規表現を扱うには scala.util.matching.Regex を使う。 正規表現は、以下のように記述できる val regex = """[Ss]cala""".r ダブルクオートを3つ使用すると、正規表現中のバックスラッシュを2つ続けてエスケープすることなく記述す…

コンパニオンオブジェクト

コンパニオンオブジェクトとは Scalaでは、classキーワードにてクラスを定義し、objectキーワードによってシングルトンオブジェクトを定義するが、同じ名前のclassとobjectを、同じファイルに定義した場合、そのシングルトンオブジェクトは「コンパニオンオ…

Scalaのパッケージ宣言

フラットなパッケージ宣言 パッケージ宣言はJavaと同様にpackage節によって行う。 package etc9.util class FileUtil この例では、FileUtil クラスは etc9.util パッケージに所属することになる。 入れ子のパッケージ宣言 パッケージ宣言は以下のように、同…

ScalaでHibernateを使う

ScalaからHibernateを使ってみる。 利用するライブラリ 利用するライブラリは以下 antlr-2.7.6.jar commons-collections-3.1.jar commons-lang-2.4.jar dom4j-1.6.1.jar ejb3-persistence.jar h2-1.1.117.jar hibernate3.jar hibernate-annotations.jar hibe…

暗黙的型変換 implicit

暗黙的型変換とは x + y が型チェックを通らない場合、Scalaコンパイラーは x に何らかの型変換を行い、型チェックが通る状態としてコンパイルを試みる。この型変換は、implicitによって定義された変換メソッドが存在する場合に行われる。 つまり、implicit…

Scalaでの例外処理

Scalaでの例外処理は、他の言語系と同じようなノリで使えます。 例外のスロー 例外のスローは普通に throw で行う object Main extends Application { def hoge(n : Int) = if(n >= 0) n else throw new IllegalArgumentException("n must be a positive num…

ScalaとJavaの文法の対比

ScalaとJavaの文法の対比表 よくまとまっているのでメモしとこうScala for Java programmers http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers

アクターライブラリ その1

Scala には、マルチスレッド処理を簡素に実現できる Actor ライブラリがあります。Actor ライブラリは、Actor 間でのメッセージのやり取りが処理をブロックすることなく行うことができます。 簡単な非同期メッセージの送信と受信 まずは簡単な例で動作を確認…

遅延初期化

lazy キーワードにて遅延初期化を簡単に実現できます。 以下の例の場合、 class Emp(id:Int) { def getId = id val str : String = {println("init"); "lazy?"} } object Example030 extends Application { val t = new Emp(10) println(t.getId) } 実行結果…

無名関数とカリー化

無名関数 Anonymous Functionsについて順を追って・・by ScalaByExample2つの整数を引数に取り、その間の数の合計を計算するには再帰にて以下のように書けます。 object Main extends Application { def sumInts(a: Int, b: Int): Int = if (a > b) 0 else a…

リテラル

複数行文字列リテラル Scalaでは複数行の文字列リテラルを"""で表します。 object Main extends Application { val str1 = """the present string spans three lines.""" println(str1) } とすると、 the present string spans three lines. このように表示…

Swingのサンプル

簡単なフレーム SimpleGUIApplication という抽象クラスが用意されており、SwingUtilities#invokeLater を勝手にやってくれます。以下は空のパネルがあるだけのフレームの例です。 import scala.swing._ object Main extends SimpleGUIApplication { val pan…

Sourceでファイルの内容を表示

テキストファイルの出力は scala.io.Source にて以下の様に簡単に行えます。 import scala.io.Source object Main extends Application { Source.fromFile("test.txt").getLines.foreach(print) }

trait

traitの宣言と利用 trait は、Javaで言うインターフェースのようなものですが、メソッドのボディを持つことができる点が大きな違いとなります。 trait は以下のように定義します。 trait Friendly { def greet() = "Hi" } この例では、greet メソッドは"Hi"…

ケースクラス

ケースクラスはパターンマッチングのためのクラスです。 class の前に case キーワードを付けるとケースクラスになります。 abstract class Expr case class Number(n: Int) extends Expr case class Sum(e1: Expr, e2: Expr) extends Expr ケースクラスには…

ジェネリクスなクラス

ジェネリクスなクラスは[]にて型指定を行います。 class Type[T] { private var v : T = _ def set(value : T) {v=value} def get : T = v } object Main extends Application { val i1 = new Type[Int] //Int用 i1.set(100) println(i1.get) //100 val i2 =…

クラス

クラスは Java と同様に class キーワードで定義します。 class Book { val title = "Scala" def printTitle() = println("Title:" + title) } object Main extends Application { val b = new Book() b.printTitle() //Title:Scala }上記クラスをよりScala…

MapとSet

ミュータブルとイミュータブル Scala のリスト(配列)には、不変である List と可変である Array がありました。 これと同様に、Map と Set にも不変オブジェクトと可変オブジェクトがライブラリとして提供されています。Map と Set 不変オブジェクトと可変オ…

Listについて

Listの操作いろいろ object Example010 extends Application { val l = List("one","two","three") println(l(1)) //two println(l.count(e => e.length==3)) //2 文字数が3の要素数 println(l.exists(e => e=="three")) //true 要素にthreeがあるかどうか p…

ListとArray

List は不変オブジェクト (immutable object) Array は可変オブジェクト (mutable object) Java で言う String(immutable object) と StringBuilder(mutable object) のような関係です。 リスト リストの書き方には、List のコンストラクタを使うやり方と、…

タプル

タプル(tuple)とは タプルは異なる型の要素を複数持つことができるコンテナオブジェクト リストと同様にイミュータブル(不変) タプルの使用 新しいクラスを作成せずに、複数の値を1つにグループ化して扱える。 Javaではメソッドの戻り値などで、複数の値を返…

ループの書き方

単純なループ ループは以下のように書けます。 object Main extends Application { // forループで 0 1 2 3 4 の表示(until) for (i <- 0 until 5) { print(i + " ") } // forループで 0 1 2 3 4 の表示(to) for (i <- 0 to 4) { print(i + " ") } // while…

全てがオブジェクト

Scala は純粋オブジェクト指向言語です。これには、数値や関数も含まれます。Java でいうプリミティブ型はありません。 以下の2つは同じ意味になります。 1 + 2 * 3 1.+(2.*(3))1行目は実際には+メソッドと*メソッドの呼び出しとなっています。これは Scala…

条件分岐(if-else)について

if-else 文は普通に書けますが、Scala では評価式として扱われます。以下の例を見て下さい。 object Hoge extends Application { val num = 5 println( if(num % 2 == 0) "偶数" else "奇数" ) }この結果、「奇数」と表示されます。まとめると、if-else 文は…

インポート宣言

Scala では Java の API がシームレスに使えます。このとき、Java と同じようにインポート宣言を行います。Scala でのインポート宣言は Java のインポート宣言より少し強力です。 import java.text.DateFormat // Javaと同様のインポート宣言 import java.te…