制御フロー(ツアー)
他のプログラム言語と同様に、Kotlinもコード片を評価した結果がtrueかどうかによって処理を決定する事が出来ます。 そのようなコード片を条件式(conditional expressions)と呼んだりします。 また、Kotlinはループを作成し、処理を繰り返す事も出来ます。
条件式
Kotlinには条件式をチェックする目的で、if
とwhen
があります。
もし
if
とwhen
のどちらにしようか迷ったら、when
を使う事をオススメします。そちらの方がより安全で頑強なプログラムとなるからです。
If
if
の使い方は、その後にカッコ()
の中に条件式を入れて、その次にその結果がtrueだったら実行したいアクションを中括弧{}
の中に入れます:
Kotlinには三項演算子、condition ? then : else
がありません(訳注:C言語などの言語にはあるがKotlinには無い機能)
三項演算子の代わりに、Kotlinはif
を式として使う事が出来ます。
if
を式として使う時は、中括弧{}
がありません:(訳注:中括弧なしでも構わない、という意味だと思う)
When
条件式に対して複数の分岐がある場合はwhen
を使います。
when
は文としても式としても使う事が出来ます。
when
を文として使う時の例は以下のようになります:
- 条件文をカッコ
()
の中に入れ、実行すべきアクションを中括弧{}
の中に入れます - 各分岐では、
->
を使って条件とアクションを分けます
分岐の条件は一つずつ順番にチェックされて、最初に条件を満たすまでチェックが続く事に注目してください。 言い換えると最初に条件に一致した分岐だけが実行されます。
以下はwhen
を式として使う例です。when
シンタックスがそのまま変数に直接代入されています:
when
を式として使う場合は、コンパイラが分岐の条件節ですべての可能性が尽くされていると判定出来る場合を除いては、else節が必須となります。
さきほどの例ではwhen
は変数とマッチングするのに便利である事が見て取れました。
ですがwhen
はさらに、連鎖するBoolean式をチェックするのにも有用です:
範囲(Range)
ループについての話をする前に、ループでどの範囲を反復処理をするかを指定するのに使えるrangeというものを、どのように構築するかを知っておくと良いでしょう。
Kotlinでもっとも一般的なrangeの作り方は、..
演算子 を使う方法です。例えば、1..4
は 1, 2, 3, 4
という意味になります。
終わりの値を含まないrangeを作りたい場合は、..<
演算子 を使います。例えば、1..<4
は 1, 2, 3
という意味になります。
逆の順序でrangeを作りたい場合はdownTo
を使います。例えば、4 downTo 1
は 4, 3, 2, 1
という意味になります。
1以外のステップで増えていくようなrangeを作りたい場合は、step
を使ってお望みの増加幅を指定します。
例えば、1..5 step 2
は 1, 3, 5
という意味になります。
ここまで話した事は Char
のrangeでも同様となります:
'a'..'d'
は'a', 'b', 'c', 'd'
という意味になります'z' downTo 's' step 2
は'z', 'x', 'v', 't'
という意味になります
ループ
プログラムにおいて最も一般的なループ構造といえば、for
とwhile
でしょう。
for
はrangeの値に渡って繰り返し処理を行いたい時に使います。
while
は特定の条件が満たされるまで処理をし続けます。
For
rangeについて新たに学んだ知識をもとに、数字を1から5まで繰り返してその数字をprintするforループを作る事が出来ます。
カッコ ()
の中にイテレータかrangeを、キーワードの in
とともに置きます。
そして行いたいアクションを中括弧 {}
の中に置きます:
(訳注:iteratorでは無いような…)
コレクションもループで反復処理出来ます:
While
while
は2通りの使い方があります:
- 条件式がtrueの間はコードブロックを実行し続ける (
while
) - コードブロックをまず実行し、そしてその後に条件式をチェックする (
do-while
)
最初のユースケースでは (while
):
- whileループを続ける条件となる条件式を、カッコ
()
の中に宣言する - 実行したいアクションを、中括弧
{}
の中に置く
以下の例では インクリメント演算子
++
を、cakesEaten
変数の値をインクリメントするのに使っています。
二番目のユースケースでは (do-while
):
- whileループを続ける条件となる条件式を、カッコ
()
の中に宣言する - 実行したいアクションを、中括弧
{}
の中に、do
キーワードとともに定義する
条件式とループについてさらに知りたい人は、条件式とループを参照ください。
今やあなたはKotlinの制御フローの基礎を理解しました。あなた自身の関数を書く方法を学ぶ時が来ました。
練習問題
練習問題 1
when
式を使って、ゲームボーイのボタンの名前を入れたらそのボタンで実行される事をprintするように以下のプログラムを変更せよ。
Button | アクション |
---|---|
A | Yes |
B | No |
X | Menu |
Y | Nothing |
それ以外 | そんなボタンありません |
解答例
fun main() {
val button = "A"
println(
when (button) {
"A" -> "Yes"
"B" -> "No"
"X" -> "Menu"
"Y" -> "Nothing"
else -> "そんなボタンありません"
}
)
}
練習問題 2
スライスされたピザを数えて行って、8スライスでまるまるピザ一枚になるまで数える以下のプログラムがあります。 このプログラムを二つの方法でリファクタリングしてください:
while
ループを使ってdo-while
ループを使って
解答例 1
fun main() {
var pizzaSlices = 0
while ( pizzaSlices < 7 ) {
pizzaSlices++
println("ピザが $pizzaSlices 片しか無い :(")
}
pizzaSlices++
println("ピザが $pizzaSlices 片! やったね! ピザがまるごと一枚あるよ! :D")
}
解答例 2
fun main() {
var pizzaSlices = 0
pizzaSlices++
do {
println("ピザが $pizzaSlices 片しか無い :(")
pizzaSlices++
} while ( pizzaSlices < 8 )
println("ピザが $pizzaSlices 片! やったね! ピザがまるごと一枚あるよ! :D")
}
練習問題 3
Fizz Buzzゲームをシミュレートするプログラムを書け。 あなたの任務は数字を1から100まで増やして行って、3で割れる時はその数字を”fizz”に置き換え、 5で割れる数字は”buzz”で置き換え、3と5の両方で割れる数字は”fizzbuzz”に置き換えたものをprintlnするというものです。
ヒント
数字をカウントするにはfor
ループを使い、各ステップで何を出力するかを決める所ではwhen
式を使えば良い。
解答例
fun main() {
for (number in 1..100) {
println(
when {
number % 15 == 0 -> "fizzbuzz"
number % 3 == 0 -> "fizz"
number % 5 == 0 -> "buzz"
else -> number.toString()
}
)
}
}
練習問題 4
単語のリストがあります。for
とif
を使って、文字l
から始まる単語だけをprintしてください。
ヒント
String型の.startsWith()
関数を使おう。
解答例
fun main() {
val words = listOf("dinosaur", "limousine", "magazine", "language")
for (w in words) {
if (w.startsWith("l"))
println(w)
}
}