Scalaに入門したい。 #3 制御構文
前回「Scalaに入門したい。#2 変数と関数 - 風の谷の備忘録」は、変数と関数の宣言方法についてお勉強したので、今回はScalaの制御構文についてみて行こうと思う。
if文…if式?
まず下のコードについてみていく
scala> if (1 < 3) true else false res18: Boolean = true scala> if (1 > 3) true else false res19: Boolean = false //trueとfalseはBoolean型のリテラル
みて分かる通りブロックがなく
if (条件式) [true時の処理] else [false時の処理]
というようになる。javaの三項演算子に似てる。
条件式を抜けて処理部分が評価され、評価された値が返る仕組みになっている。
scala> if (1 > 3) | true //ここで[Enter] res20: AnyVal = ()
こんな感じになってしまう。trueを書いたところでifが実行されてるらしい
そして何で結果型がAnyValかっていうと
d:id:matt-k:20100413より
2.8から返り値の型がAnyValになるみたい.
if (true) 3
は
if (true) 3 else ()
という解釈になるみたい.
http://d.hatena.ne.jp/matt-k/20100413
とのこと。
ちなみに
scala> (x:Int,y:Int) => if(x > y) x else y res25: (Int, Int) => Int = <function2> scala> res25(2,3) res26: Int = 3 scala> println(res25(3,5)) 5
こゆこともできる。やっぱ式か?…
while文
scala> var i = 0 i: Int = 0 scala> while(i<5){ | println(i) | i+=1 | } 0 1 2 3 4
まあ普通のwhileよね。javaと変わらん
ちなみにScalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)
だとなるべく使うなとのこと
何故かと言えば、whileの終了条件にはvarな値を使うことが多い。でもそれだと副作用を産むので関数型っぽくならんよってことらしい
do-while
scala> var i = 0 i: Int = 0 scala> do{ | i+=1 | println(i) | }while(i<5) 1 2 3 4 5
for式
反復処理
scala> for(i <- Range(0,10)) | print(i) 0123456789 scala> for( i <- 0 to 10){ | print(i) | } 012345678910
"<-"はpythonでいう"in"と同じ。
Rangeってのはscala.collection.immutable.Rangeから来ててcollectionの子クラスだからこんな風に使えます。pythonと同じね。
フィルター
scala> for(i <- Range(0,10) if(i%2 ==0)) | print(i) 02468
forの条件式?内にifでフィルターもかけられるよ!!これ便利ね
入れ子
scala>for{i <- Range(0,3) | t <- Range(0,3) | } | {print("i = "+i+", ") | println("t = "+t) |} i = 0, t = 0 i = 0, t = 1 i = 0, t = 2 i = 1, t = 0 i = 1, t = 1 i = 1, t = 2 i = 2, t = 0 i = 2, t = 1 i = 2, t = 2
入れ子にも出来るよ!!
いろいろできますなあ。入れ子の例で中括弧使ってるのは行末判定に必要な";"を打つのがめんどくさいからです。
とりあえず今回はここまで次回はデータ構造をみていきたい