MEL合宿 -14日目-

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」しないことで、効率よくコードがかける場合がある!

それでは、次回もお楽しみに!!∠( ゚д゚)/