プログラミング言語別のswitch文

#変更履歴
- 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)
https://github.com/RYOTA-EAST/switch

### 動作環境
- macOS Monterey 12.0.1
- プログラミング言語のバージョンはそれぞれに記載


#matchとifの違い(python3.10.0)
pythonではmatchとなり、
変数colorの中身によって処理を切り替える。

下の処理はcolorが"black"なので"パンダの色"と出力する。
この様に一つの条件で複数の結果があるような処理を書きやすい

```python:match.py
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で書くと

```python:if1.py
color = "black"

if color=="red":
  print("赤")
elif color=="blue":
  print("青")
elif color=="black" or color=="white":
  print("パンダの色")
else:
  print("その他")

# 出力:"パンダの色"
```

ifは毎度、条件式（変数名と式）を記述する必要があります。
matchの様に1つの値に複数の判定・処理がある場合、記述が増えます。

ただしifにもメリットがあります。

```python:if2.py
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```で実行

```c:switch.c
#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)

```ruby:ruby
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とほぼ同じ

```ruby:case_in.rb
color = "black"

case color
  in "red" then print "赤"
  in "blue" then print "青"
  in "black" | "white" then print "パンダの色"
  else print ("その他")
end

# 出力：パンダの色
```

###特徴
- thenをつけると１行で記述可能(whenも)
- 複数条件はバーチカルライン(|)

#VBA（Excel for Mac 16.56）
- Select Case文(Select Case → Case)
- Rangeを使ってエクセルのA1から値を取得
- 右隣のB1に出力

```vb:VBA
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投稿しようと思います！