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インタプリタで行を分けて書こうとすると

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

入れ子にも出来るよ!!

いろいろできますなあ。入れ子の例で中括弧使ってるのは行末判定に必要な";"を打つのがめんどくさいからです。


とりあえず今回はここまで次回はデータ構造をみていきたい