概要
今まで Java でしか開発をしたことのないプログラマーが Scala で開発することになりそうなので、勉強を始めました。
諸注意
日付は実際の営業日を示します。大相撲の本場所は15日目までありますが、いつまで続くかはわかりません。千秋楽(15日目)までに終わるかもわかりません。
Scala IDEをインストール
Mac 用では Eclipse とセットにしたものを配っているので、それを使えばよいでしょう。あるいは、単に学習目的であれば Ideone 等のオンラインコンパイラで Web ブラウザから実行してもよいかもしれません。
下記は適宜実施してください。
- プロジェクト作成
- クラス作成
日本語化
Pleiades プラグインをダウンロードして、Scala IDE の plugins フォルダに置き、「eclipse」の「パッケージの内容を編集」を実行、その中にあるMacOSフォルダの「eclipse.ini」に下記1行を追記して再起動します。
-javaagent:../../../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
Scala 関連はほぼ日本語化されませんが、仕方ありません。
コード補完が効かない?
単にショートカットが Control キーになっているのに Command キーを押していたからでした。
「Scala IDE」→「環境設定」→「一般」→「キー」→「コンテンツ・アシスト」を「Command+Space」に変更します。
Hello world する
Scala のインデントは半角スペース2字です。
object HelloWorld {
def main(args: Array[String]) {
println("Hello world.")
}
}
書いてみて思ったこと
- object……Singleton オブジェクトの定義、Scala は Singleton を言語レベルでサポート
- 「変数名: 型名」で宣言(Java と逆)
- 標準出力は println で可能…… Groovy もそうなので、そうできない Java がちょっと残念(なお Groovy は括弧でくくる必要すらない)
- セミコロンはあってもなくてもよい……だったらあってもいいのでは
- main……これがあるクラスは Main として認識される。なお Scala に static の概念はないという
- Array……配列が特例ではないクラスで定義されている?
変数の定義
定数(immutable) | val 変数名: 型名 = 値 |
---|---|
変数(mutable) | var 変数名: 型名 = 値 |
配列
object ArraySample {
def main(args: Array[String]) {
val items: Array[String] = Array[String]("apple", "bacon", "cheeze")
if (items.contains("onion")) {
println("Array has onion,");
} else {
println("Array doesn't have onion,");
}
}
}
書いてみて思ったこと
- Array は new ではなく factory method を使って初期化している
- Array は Java の配列とは異なり contains が使える
Range
object RangeSample {
def main(args: Array[String]) {
val items: Range = Range.apply(0, 100)// 0 から 99
items.foreach { it => println(it) }
}
}
Filter & ForEach
ここで初めてメソッドを使ってみます。
object ClosureSample {
def main(args: Array[String]) {
val items: Range = Range.apply(1, 100)
items.filter { it => isEven(it) }
.foreach { it => println(it) }
}
def isEven(i: Int): Boolean = {
return i % 2 == 0;
}
}
書いてみて思ったこと
- Stream API と使い勝手はほぼ同じなので特に何もない(Javaから目線)
- foreach が全部小文字(Javaから目線)
- メソッドの引数は val 扱い、なので再代入不可
メソッドの書き方
def メソッド名(引数名: 型名): 戻り値型 = {
return i % 2 == 0;
}
FizzBuzz
番数も取り進みましたるところ、かたや、 if-else, if-else, こなた、 Pattern match, Pattern match, この相撲一番にて本日の、打ち止め
まず if-elseで書いてみる
object FizzBuzzSample {
def main(args: Array[String]) {
val items: Range = Range.apply(1, 100)
items.foreach { it => fizzBuzz(it) }
}
def fizzBuzz(i: Int) {
if (i != 1) {
print(", ")
}
if (i % 15 == 0) {
print("fizzbuzz")
} else if (i % 3 == 0) {
print("fizz")
} else if (i % 5 == 0) {
print("buzz")
} else {
print(i)
}
}
}
Pattern match
Scala には Pattern match というものがあるそうなので、それを試してみます。
object FizzBuzzSample {
def main(args: Array[String]) {
val items: Range = Range.apply(1, 100)
items.foreach { it => fizzBuzz(it) }
}
def fizzBuzz(i: Int) {
if (i != 1) {
print(", ")
}
i.match {
case i if (i % 15 == 0) => print("fizzbuzz")
case i if (i % 3 == 0) => print("fizz")
case i if (i % 5 == 0) => print("buzz")
case _ => print(i)
}
}
}
なにこれすごい……というほどでもないでしょうか?今回のケースでは、前の例でも if-else 文を1行で書いてしまえば同じようになるので、今ひとつありがたみがわかりにくいかもしれないです。