やほーいもうこれを楽しみに生きているよ僕はScalaかわいいよScala(ノДT)

関数型言語っぽいとはいえ手続き型言語でもあるのでループある。
とりあえず1から10までまわしてみよう。
scala> for(i <- 1 to 10) println(i + " hei")
1 hei
2 hei
3 hei
4 hei
5 hei
6 hei
7 hei
8 hei
9 hei
10 hei


うーんシンプル。
次はenhanced for的なの。
scala> var list = List("hoge", "foo", "bar")
list: List[java.lang.String] = List(hoge, foo, bar)

scala> for(word <- list) println(word)
hoge
foo
bar


さらにさらに、ループ式のとこで条件式が使える!
scala> for(i <- 1 to 10 ; if(i == 3 || i > 7)) println(i) 
3
8
9
10

scala> for(i <- 1 to 10 ; if(i > 3) ; if(i < 8)) println(i)
4
5
6
7

イイ・・・:*:・( ̄∀ ̄)・:*:

あとなんかyieldってのができるらしい。
for - yieldで、yieldに続けた処理が実行されて、各ループごとの結果を返せる。
どういうことかというと、
scala> var list = for(i <- 1 to 5) yield i * 3 
list: RandomAccessSeq.Projection[Int] = RangeM(3, 6, 9, 12, 15)

scala> for(i <- list) println(i)
3
6
9
12
15

こういうこと。はんぱねえ。まじはんぱねえ。

細かいところをいうと、->の左側にある各ループでの変数はval扱いで、
毎回新しく作られるので副作用なし。
んでScalaのループはJavaとかのいわゆるループとは実は似て非なるもので、
1 to 10みたいな書き方はそれっぽく見せてるだけらしい。
つーのも、実は1 to 10は1.to(10)の省略形らしい。
toってのはイテレータを返すそうな。
あとbreakとかcontinueとかないんだって。

さらにさらに、リストの各要素になんかするーってのであればわざわざforループしなくてもいいらしい。
scala> var list = List("hoge","bar","foo")
list: List[java.lang.String] = List(hoge, bar, foo)

scala> list.map(s => s + " !!")
res4: List[java.lang.String] = List(hoge !!, bar !!, foo !!)

mapメソッドはリストの各要素をsにいれて=>後の処理を実行してくれる。
やばいもう鼻血でそう。

mapと似てるやつにforeachってのがあって、これは各要素に関数を適用したいとき使う。
scala> def hoge(s:String) = println("steve " + s + " jobs!")
hoge: (String)Unit

scala> list.foreach(hoge _)
steve hoge jobs!
steve bar jobs!
steve foo jobs!

scala> list.foreach(hoge)
steve hoge jobs!
steve bar jobs!
steve foo jobs!

ここでは_が各要素を表してて、それがhogeにわたる形。
この_は省略もできる。
foreachを使えば、リストの中身表示したいなーってとき
list.foreach(println)でいける。笑えてきたよなんだこれヘ(゚∀゚*)ノ

あとwhileはまあ普通な感じだった。でもなんかあるかも。
scala> var i = 1                                     
i: Int = 1

scala> while(i < list.length) {
| println("fight " + i)
| i += 1
| }
fight 1
fight 2

scala> var i = 1
i: Int = 1

scala> do {
| println("fight " + i)
| i += 1
| }while(i < list.length)
fight 1
fight 2