MEL合宿 -14日目-は、「if文」と似ている、処理を分岐させることができる「switch文」について見ていきたいと思います!(`・ω・´)ゞ
switch文って?
MELでのswitch文は、以下のように記述します。
swtich(変数){ case 値A: 変数の値が、値Aと同じ時の処理 break; case 値B: 変数の値が、変数Bと同じ時の処理 break; default: 変数の値が、どの値とも同じでない時の処理 break; }
やっていることは「if文」とそっくりなのですが、「switch文」は条件式を使わずに変数の値を比較して分岐します。ちょうど、if文で「==」だけで作ったようなのが「switch」になります(*´ω`*)b
最後の「default」とは、if文の「else」とそっくりですね!これは書いても、書かなくてもOKです。
switchを使ってみる!
「MEL合宿 -12日目-」でやった、currentUnitを使って時間の単位を取得してfpsを表示するのを「switch文」でやってみましょう!ちょうど「==」しか使わないif文だったので、switch文で書くこともできます(゚∀゚)
{ string $timeUnit = `currentUnit -q -time`; switch($timeUnit){ case "film": print "FPS is 24."; break; case "ntsc": print "FPS is 30."; break; case "ntscf": print "FPS is 60."; break; default: error "FPS is unknown."; break; } }
if文のに比べて、分岐候補にインデントがつくのでちょっと見やすいコードになるんじゃないかな?っと思います!
breakって?
先程のコードを見てみると、caseの最後に必ず「break」がありますね!これは、「switch」の処理を終了して抜け出すっという意味になります!最初ミスしがちなのですが、この「break」を忘れると「処理しなくていいcase」が実行されてしまいます(´・ω・`)
試しに、「break」を書かないバージョンを実行してみましょう。
{ string $timeUnit = `currentUnit -q -time`; switch($timeUnit){ case "film": print "FPS is 24."; case "ntsc": print "FPS is 30."; case "ntscf": print "FPS is 60."; default: error "FPS is unknown."; } }
すると、、、
なんと、すべての「case」が実行されてしまいます(;・∀・)
あえてbreakを書かない場合もある!
あえてbreakさせないことで、「ダイスの5か6なら成功、1か2なら失敗、それ以外はもう一度!」という処理を書きやすくすることもできます。
実際に試してみるために、新しいコマンドを使ってみましょう!
rand
「rand」は、PCがランダムな数字を選んでくれます。これをプログラムでは「乱数」と言います。実行するたびにランダムで違う数値を返してくれるので、サイコロのような感じですね(*´ω`*)b
値を指定することで、ランダムに選ばれる数字の範囲を制限することもできます!!
実験!
では、1~6の乱数を作って処理を分岐させてみましょう!実行するたびに「Failed!!」「Success!!」「One more!!」のどれかがScript Editorに表示されます。
{ int $dice = `rand 1 6`; switch($dice){ case 1: case 2: print "Failed!!"; break; case 5: case 6: print "Success!!"; break; default: print "One more!!"; break; } }
変数「$dice」が「1」だった場合は「break」が書かれていないので、そのまま下にある「case 2」の部分が実行されます!しかし、「case 2」ではちゃんと「break」があるのでswitchから抜け出します。
次に「5」だった場合も「break」が書かれていないので、そのまま下にある「case 6」の部分が実行されます。
「1」と「5」の場合は何も処理を書きませんでしたが、「1」の時は「OMG」と表示してから「Failed!!」を表示させるなんてことも可能です!
{ int $dice = `rand 1 6`; switch($dice){ case 1: print "OMG!!\n"; case 2: print "Failed!!"; break; case 5: case 6: print "Success!!"; break; default: print "One more!!"; break; } }
すると、以下のように1の時は「OMG!!」と表示させつつも、「1」と「2」の共通の処理「Failed!!」を表示させることができます∠( ゚д゚)/
うまーく処理の流れを整理すると、「switch」をつかうことで効率よくコードをかけるようになります!!(`・ω・´)ゞ
まとめ!
- 「switch」を使うと、変数の値によって処理を分岐させることができる!
- switchでは、条件式は使わず「値の一致」で分岐する!
- 分岐のパターンは「case 値:」で書いていく!
- 「break」を使うと、「switch」から抜け出せる!
- breakを忘れると、そのまま下にある「case」が実行される!
- あえて「break」しないことで、効率よくコードがかける場合がある!
それでは、次回もお楽しみに!!∠( ゚д゚)/