Scalaの特徴
-
オブジェクト指向と関数型プログラミングのハイブリッド
- →なので、ひとまずオブジェクト指向的な使い方で書きつつ、徐々に関数プログラミングを覚えていく、ということもできる。
- →なので、ひとまずオブジェクト指向的な使い方で書きつつ、徐々に関数プログラミングを覚えていく、ということもできる。
-
静的型付け言語
- →しかし強力な型推論により、自明な型は省略可能なので、Ruby等のスクリプト言語のように気軽に書ける
-
ネイティブにサポートする機能であるかのように動作するライブラリが作成可能
- →拡張性
-
グルーコードなしに、Javaのすべてのライブラリを、そのまま利用可能
関数型プログラミング
-
関数は第一級オブジェクト
-
参照透明性
-
述語関数(predicate)
- 結果が Boolean となる関数リテラル
変数
var msg = "Hello, World" // var は変数定義
val msg = "Hello, World" // val は再代入不可能な変数定義
型
- Javaのvoidに相当するのは、Unit型
関数
- 結果型(return type ではなく、result type) と呼ばれる
def max(x: Int, y: Int): Int = {
if (x > y) x
else y
}
コマンドライン引数
println("Hello, " + args(0) + "!") // 配列へのアクセスは[]ではない
制御構文
var i = 0
while (i < args.length) { // 命令型のスタイル。
if (i != 0)
print(" ")
print(args(i))
i += 1
}
args.foreach((arg: String) => println(arg))
// ↓省略
args.foreach(arg => println(arg))
// ↓省略
args.foreach(println) // 引数が1個で1文からなるなら、省略可能
for (arg <- args)
println(arg)
演算子
- Scalaには伝統的な意味での演算子は無い
- +, -, *, / などはメソッド名
1 + 2 // (1).+(2) の省略形
- パラメータがひとつなら、. や () を省略できる
- 単に省略できて簡潔、という意味にとどまらず、この仕組みが、ライブラリの機能をまるでネイティブの機能のように見せることにつながっているのでは。
メソッド
- method(x) は、method.apply(x) に変換される
- method(x) = y は、method.update(x, y) に変換される
コレクション
-
Array はミュータブル(変更可能)⇔Listはイミュータブル(変更不能)
-
タプルは、イミュータブルで異なる型の要素を持てるので、メソッドから複数の値を返したいときなどに使われる
var a = ("a", "b", 3)
a._1 // "a"
a._2 // "b"
a._3 // 3
- セットは、デフォルトではイミュータブル(scala.collection.immutable.Set)
- ミュータブルなセットを使うなら、明示的に import scala.collection.mutable.Set
var s = Set("a", "b")
- マップは、デフォルトではイミュータブル(scala.collection.immutable.Map)
- ミュータブルなマップを使うなら、明示的に import scala.collection.mutable.Map
var m = Map(1 -> "hoge", 2 -> "hage")