ARGENTO CUORE

 May the code be with you.

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.05.09[日] Scala 制御式メモ

if式
if(条件){
条件がtrueのときの処理
}else{
条件がfalseの時の処理
}


if(条件) ~ else ~
とも書ける

Scalaでは式は値を持つので、if式も値を持っている。
例えば、
if(true) 1
とした場合の結果値は、AnyVal = 1となる。これはifを評価した後の値(=1)がAnyValを継承するプリミティブ型のためで、
if(true) "hello"
とした場合の結果値は、Any = helloとなる。

if(false) 1 else 2
の場合、この結果値は、AnyVal = 2とはならない。これは、else以降の部分は、単純な2という数値であって、if式による評価値とはならないため。
else以降をif式の評価値として得るためには
if(false) 1 else if(true) 2
というように書く。この場合、AnyVal = 2となる。else ifという式は存在しせず、
[if-else- [if-else- [if-else-] ] ]
という形の入れ子になっていると考えるとわかりやすい。


whileループ
while(条件){
条件がtrueのときにはここの処理を繰り返す
}


whileもif式と同様、結果値を返すが、その結果値に意味はない。結果値は必ずUnitになる。


do-whileループ
do {
少なくとも1回実行され、条件がtrueである場合には繰り返し実行される。
}while(条件)


whileループと同様、結果値に意味はない。結果値は必ずUnitになる。


for式
for() yield 式

for(n <- 0 to 10){
println(n)
}

と書けば、0から10までが標準出力に表示される。この式の結果値はUnitになるが、yieldを用いることで、意味のある結果値を得ることができる。

for(n <- 0 to 10) yield n
とすると、Vector(0,1,2,3,4,5,6,7,8,9,10)という結果値を得られる。

for(s <- Array("a","b","c")) yield s
の場合は、Array(a,b,c)という結果値を得られる。

()内には、ジェネレーター、フィルター、定義を含めることができる。
・ジェネレーター:配列などのコレクションから要素を取り出す
element <- arrHoge

・フィルター:取り出した要素をふるいにかける
if 条件

・定義:for式の中だけで有効になるvalを定義する
v = element + "aaa"

for (generator; definition; filter) yield n

と書くことができるし、

for {
generator
definition
filter
} yeild n


というように、{}を使うことで、複数行に分けて記述することもできる。

たとえば、0から10のうち、偶数だけを結果として得るためのfor式は、
for {
x <- 0 to 10 //ジェネレーター
if ((x%2)==0) //フィルター
} yield x


と書ける。一行で書くなら、
for (x <- 0 to 10; x ((x%2)==0)) yield x

と書く。
ジェネレーターが1つだけという制限はない。2つ以上のジェネレーターを記述する場合、それらは、書いた順に実行される。

foreach

Array("a","b").foreach (a => println(a))

と書くと、a,bの要素の値を一文字ずつprintlnにより出力する。
a => println(a)
の部分は関数リテラルと呼び、foreachメソッドによって実行される。

関数リテラルは
(v:type) => Unit
と書ける。もし、型を省略したくない場合には、
Array("a","b").foreach((a:String) => println(a))

と書く。
=>の右辺にはUnitを指定することができるため、

Array("a","b").foreach((a:String) => {
println(a)
println(a+"c")
})

というように書くこともできる。

match式
x match {
case 1 => println("one")
}

switchと似たような機能を持ち、上記例は、値xが1の場合はoneを出力するようにしてある。
case _ => 処理
というように、アンダーバーを指定した場合には、どんな条件でもマッチする。並んだcaseは、上から順に確認されるため、アンダーバーを用いたcase行は、必ず末尾の行に記述する。

このmatch式は、Option型の値を扱う場合などに便利に使用できる。
例えば、
val map = Map("foo"->"hoge", "bar"->"fuga", "baz"->"piyo")
def a(key:String):Unit = map.get(key) match {
case Some(n) => println(n)
case None => println("none")
}

と書ける。keywordに対応する値がない場合にはNoneが来るので、要素が存在するかどうかなどの複雑な条件判定を書く必要がなくなる。
スポンサーサイト

Comment






(編集・削除用)


管理者にだけ表示を許可

Trackback

http://ronor.blog81.fc2.com/tb.php/79-a72ecdaa

この記事にトラックバック(FC2Blog User)

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。