他の言語を扱ってきたプログラマが、Scalaのコードを読む際に戸惑いがちな記号について集めてみました.
=>(イコール 大なり)
- ラムダ式の構文.関数の引数と処理を区切る. 例: (a: Int, b: Int) => { a + b} //a, bを引数にする関数
- クラスをimportする際に、別名をつける.例: import java.util.{ Map => JMap}//MapをJMapという名前でimportしている
- match-case のcaseで判定文とtrue時の処理を区切る.例: case “foo” => 1 // matchで指定した変数がfooのとき、1を返す.
_ (アンダースコア)
- 全てのパッケージやクラスをimportする.例: import java.text.DataFormat._
- 変数の宣言時にその型のデフォルト値を設定できる. 例: var i: Int = _
- match-case の判定で、タプルの部分一致を行う.例: case (_, 4, _) => true//タプルの2番目の値が4のときtrueとなる.その他の値は問わない.
- match-caseの判定で、その他の処理を行う場合.(Javaのdefaultに相当)
- 変数の代わりのplaceholderとして利用する.関数の引数部分(括弧から=>まで)は代入先の変数の型が分かっている場合省略できる.(*1 詳しくは後述)
*1: 引数部分を省略すると引数に名前でアクセスすることが出来なくなる.そこで、_を利用することでアクセスできる.
但し、複数回利用することは出来ず、引数宣言の順番と_が出てくる順番は対応することになる.また、引数の数とplaceholderの数は一致させる必要がある.(一部の引数を利用しないということは出来ない)
例)
1 2 3 4 5 6 7 8 |
scala> var f = (a: Int) => { a + 10} //変数fに引数がIntひとつ、戻り値がIntの関数を代入している f: Int => Int = <function1> scala> f(100) res1: Int = 110 scala> f = { _ * 10 } // 最初にfへ代入した時点で変数の型がわかっているため、引数部分は省略できる. f: Int => Int = <function1> scala> f(100) res2: Int = 1000 |
() (括弧)
- Unit型(要素が0個のタプル)を表す.
->(マイナス大なり)
- 値が2つのタプルを定義する.例: “foo” -> 1 // Pair(“foo”, 1)と同じ効果がある
→(全角右矢印)
- ->と同じ効果
???(クエスチョンマーク3つ)
- 例外NotImplementedErrorをスローする.例: def method = ??? // NotImplementedErrorをスローするだけのメソッド
記号以外
記号以外でもScala特有で読み方を誤りそうなものについてまとめました.
applyメソッド
- コンストラクタ的にArray(1, 2, 3)のような書き方をすると呼ばれるメソッド.コンストラクタがnewをつけるのに対し、こちらはつけない.Scalaではapplyという名前のメソッドは呼び出し時にメソッド名を省略できるため、このような書き方になる.