#変更履歴
- 2022/1/16
- Rubyの「case in」追加
- C言語の文字列比較あたりの記述修正
- まとめの表にbreakの有無追加
#初めに
switch文に初めて触れたのは、業務改善でC言語を使った時です。
場合によってifの分岐より簡潔に記述できるswitch文は好きな処理です
ライブラリが豊富で汎用性があるpythonを使っていて
「switch文なぜなんでないんだ・・・。」と、ずっと引っかかっていました。
そんなことを忘れかけていた中、twitterを見ている時に
pythonのバージョン3.10.0にてswitchと同じ動作をする
matchが追加されていることを、先日知りました。(リリースが2021年10月の様です)
今まで長文まとめるの時間かかるな、そんないい記事書けないなと
アウトプットはすぐ投稿できるTwitterに逃げていましたが
switch文でQiitaデビューしようと思いました、暖かい目でご覧ください
###書くこと
- match関数とif関数の違い(python)
- プログラミング言語でのswitch文の違い(C言語・Ruby・VBA)
###書かないこと
- 言語ごとの深掘り(数値の場合どうなるか等)
###コード内容
- 色で英語の文字列を日本語で出力
- 変数名:color
- colorが"red"の場合、出力は"赤"
- colorが"white"か"black"の場合、出力は"パンダの色"(複数条件)
コード(GitHub)
動作環境
- macOS Monterey 12.0.1
- プログラミング言語のバージョンはそれぞれに記載
#matchとifの違い(python3.10.0)
pythonではmatchとなり、
変数colorの中身によって処理を切り替える。
下の処理はcolorが"black"なので"パンダの色"と出力する。
この様に一つの条件で複数の結果があるような処理を書きやすい
color = "black"
match color:
case "red":
print("赤")
case "blue":
print("青")
case "black" | "white":
print("パンダの色")
case _:
print("その他")
# 出力:"パンダの色"
特徴
- matchやcaseの後ろに:(コロン)をつける
-
end
やbreak
のように終了を明記しない - 「match > case > 処理 」にインデントが必要(つけないとエラーになる)
- caseが複数ある場合はバーチカルライン
|
でつなぐ
matchをifで書くと
color = "black"
if color=="red":
print("赤")
elif color=="blue":
print("青")
elif color=="black" or color=="white":
print("パンダの色")
else:
print("その他")
# 出力:"パンダの色"
ifは毎度、条件式(変数名と式)を記述する必要があります。
matchの様に1つの値に複数の判定・処理がある場合、記述が増えます。
ただしifにもメリットがあります。
color = "red"
val = 50
if color == "red" and val <= 20:
print("色は赤で値が20以下です")
elif color == "blue" or val > 20:
print("色は青であるか値が20を超えています")
else:
print("その他")
# 出力:"色は青であるか値が20を超えています"
毎回条件式を記述するのでandやorを使うことで
複数の値・条件を指定して判定を組むことができます
以下で別言語のswitch文と特徴を記載します
#C言語(gcc13.0.0)
- switch文
- switch→case
- 一番最初に使ったswitch文
- ターミナルで
gcc switch.c
でコンパイル後、./a.out
で実行
#include <stdio.h>
enum color {
red,
blue,
black,
white,
};
int main(void){
enum color color;
color = black;
switch(color){
case red:
printf("赤");
break;
case blue:
printf("青");
break;
case black:
case white:
printf("パンダの色");
break;
default:
printf("他の色");
}
return 0;
}
// 出力:"パンダの色"
##特徴
- 文字列の比較、他の言語の様にできない
- caseの後は数値
-
enum
で"black"は2のように文字列を数値をして扱う感じ -
break;
を入れないとcaseが一致していない処理も実行される - 複数条件はcaseを重ねる
#Ruby 【case when】 (2.6.5)
RubyはCase文(case→when)
color = "white"
case color
when "red"
print("赤")
when "blue"
print("青")
when "black", "white"
print("パンダの色")
else
print("その他")
end
# 出力:"パンダの色"
###特徴
-
end
で終了を書く必要がある - インデントなしでも処理できる
- 複数条件はカンマ(,)
#Ruby 【case in】 (3.0.0)
- 2.7で導入
- 簡単な使い方ではcase whenとほぼ同じ
color = "black"
case color
in "red" then print "赤"
in "blue" then print "青"
in "black" | "white" then print "パンダの色"
else print ("その他")
end
# 出力:パンダの色
###特徴
- thenをつけると1行で記述可能(whenも)
- 複数条件はバーチカルライン(|)
#VBA(Excel for Mac 16.56)
- Select Case文(Select Case → Case)
- Rangeを使ってエクセルのA1から値を取得
- 右隣のB1に出力
Dim color As String
color = Range("A1")
Select Case color
Case "red"
Range("B1") = "赤"
Case "bule"
Range("B1") = "青"
Case "white", "black"
Range("B1") = "パンダの色です"
Case Else
Range("B1") = "その他"
End Select
' 出力:"パンダの色"
###特徴
-
End Select
で閉じる - インデントはなしでも動作する
- 複数条件はカンマ(,)
#まとめ
言語ごとの書き方・動作
言語 | 開始 | 条件 | break | 終了 | インデント | 複数条件記述 |
---|---|---|---|---|---|---|
python | match color: | case | なし | なし | 必要 | バーチカルライン(|)でつなぐ |
C | switch(color){ | case | あり | 必要(}) | 不要 | caseを複数行で記述 |
Ruby | case color | when | なし | 必要(end) | 不要 | カンマ(,)でつなぐ |
Ruby | case color | in | なし | 必要(end) | 不要 | バーチカルライン(|)でつなぐ |
VBA | Selece Case | Case | なし | 必要(End Select) | 不要 | カンマ(,)でつなぐ |
###思ったこと
- 改めて言語によって記述方法、できることに違いがあるということがわかった
- 新たにC言語をPCで動作させることができる様になった
- コメントで不足してるところを補ってもらえた
- 言語化してまとめるのは難しい(言語をまたぐと特に)
#最後に
記事にするのは大変だけど、記事にするために動かすだけでなく
どうしてこうなるのかとか、他に方法がないかなど調べることで
知識の幅を増やすことができました
またQiita投稿しようと思います!