7. 1-1. 変数の定義
?使ったらある意味負け? ?Scalaちゃん推奨?
■var(変数)型 ■val(値)型
var 変数名:型=値 val 変数名:型=値
例) 例)
> var n: Int = 1 > val n: Int = 1
?n: Int = 1 ?n: Int = 1
再代入できない!
> n = 3 > n = 3
?n: Int = 3 ?error:
reassginment to val
8. 1-2. 代表的な型
数値 > val n: Int = 1
?n: Int = 1
文字列 > val str: String = ”hoge”
?str: java.lang.String = hoge
シンボル > val sym: Symbol = 'piyo
?sym: Symbol = 'piyo
リスト > val l: List[Int] = List(1,2,3)
?l: List[Int] = List(1,2,3)
9. 1-3. 関数の定義
def 関数名(引数名:型, …):返り値の型 = {
処理内容
}
例)
> def max(x: Int, y: Int): Int = {
| if (x < y) y else x
| }
> max(8, 3)
?res1: Int = 8
10. 1-4. 型推論
変数や関数の返り値の型宣言は、コンパイラ
が推測できる限りにおいて省略できる!
省略
例)
> val i = 4
?i: Int = 4
> val d = List(0.1, 1.2, 3.4)
?d: List[Double] = List(0.1, 1.2, 3.4)
> def hello = ”Hello, World!”
?hello: java.lang.String
11. 1-5. 制御構文(1) - if
if (条件文1) 値1 else if (条件文2) 値2 …
else 値3
必ず値を返すことに注意!
例)
> if (str.size < 3) {
| ”It's short.”
| } else if (str.size < 6) {
| ”Not so long.”
| } else ”It's long.”
?res1: java.lang.String = It's long.
12. 1-6. 制御構文(2) - for
for (ブロック引数 <- コレクション; …) 処理内容
for (ブロック引数 <- コレクション; …) yield 値
例)
> for (i <- 1 to 9) print(i + ” ”)
?1 2 3 4 5 6 7 8 9
> for (i <- (1 to 9).toList) yield i + 1
?res1: List[Int] = List(2,3,4,5,6,7,8,9,10)
> for (i <- 1 to 2; j <- 1 to 3) print("[" + i +
"," + j + "]") 外2回、内3回の
?[1,1][1,2][1,3][2,1][2,2][2,3] 二重ループ
16. 2-3. 関数と変数は等価
例)
> val half = (n: Int) => n / 2
?half: (Int) => Int = <function>
> half(14)
?res1: Int => 7
> def quartize(n: Int) = n / 4
> val quarter = quartize _
> quarter(20) 仮引数を「_」で表記
?res1: Int => 5 (_)のカッコは省略可
17. 2-4. パターンマッチング(1)
引数 match {
case パターン1 => 処理1 or 値1
:
case _ => 処理x or 値x
}
例)
> val str = ”world”
> str match {
| case ”world” => println(”Hello!”)
| case _ => ()
| }
?Hello! その他のケースは「_」にマッチ
18. 2-5. パターンマッチング(2)
例)
> List(1,2,3) match {
| case List(a, b, c) => a + b + c
| case _ => 0
} 変数a,b,cに値を束縛
?res1: Int = 6
> val v: Any = ”hoge” 型のマッチ
> v match {
| case i: Int => i * 100
| case s: String => s.size
| }
?res2: Int = 4
19. 2-6. 再帰関数
例) ループ型
> def sumLoop(n: Int) = {
| var total = 0
| for (i <- 1 to n) total += i
| total
| }
再帰型
> def sumRecursive(n: Int): Int = n match {
| case 1 => 1 返り値の型宣言
が必要!
| case _ => n + sumRecursive(n - 1)
| }
> (sumLoop(10), sumRecursive(10))
?res1: (Int, Int) = (55,55)
21. 2-8. 遅延評価
オブジェクトのフィールドの評価を、初期化時ではなく
参照時に行うようにする。
例)
> class SchrodingerCat {
| lazy val status = {
| println("Here open a box..."); "Alive!"
| }
| } まだstatusが評価されてない
> val cat = new SchrodingerCat
> cat.status ここで初めてstatusが評価される!
?Here open a box...
?res1: java.lang.String = Alive!