0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

match 式

形状に応じて分岐します。

「match 式」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

matchとは

matchは、Scalaの強力な分岐構文です。値と一連のcaseパターンを指定すると、最初に一致した分岐を実行します。

switch文を、より高機能な式ベースにしたものと考えるとよいでしょう。

基本構文

value match { case pattern => result }と記述します。それぞれのcaseで、パターンと一致したときに実行するコードを定義します。

matchは式なので、全体として値を返します。

object Main {
  def main(args: Array[String]): Unit = {
    val n = 2
    val word = n match {
      case 1 => "one"
      case 2 => "two"
      case 3 => "three"
    }
    println(word)
  }
}

ワイルドカードケース

アンダースコア_は、何にでも一致するワイルドカードです。末尾で、すべてを受け取るデフォルトとして使用します。

これがない場合、一致しない値によって実行時にMatchErrorがスローされます。

object Main {
  def main(args: Array[String]): Unit = {
    val n = 9
    val word = n match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
    }
    println(word)
  }
}

文字列のマッチング

パターンは数値に限られません。文字列リテラルを直接マッチングできます。

object Main {
  def main(args: Array[String]): Unit = {
    val cmd = "start"
    val msg = cmd match {
      case "start" => "Starting up"
      case "stop"  => "Shutting down"
      case _       => "Unknown command"
    }
    println(msg)
  }
}

matchは値を返す

各分岐が値を生成するため、matchの結果をvalに代入したり、インラインで使用したりできます。

これによりコードがすっきりし、可変変数を避けられます。

object Main {
  def main(args: Array[String]): Unit = {
    val light = "red"
    println(s"Action: " + (light match {
      case "red"   => "stop"
      case "green" => "go"
      case _       => "caution"
    }))
  }
}

ケースの組み合わせ

|(パイプ)を使うと、1つのケースで複数の値にマッチングできます。指定したすべての値が同じ分岐に進みます。

object Main {
  def main(args: Array[String]): Unit = {
    val day = "Sat"
    val kind = day match {
      case "Sat" | "Sun" => "weekend"
      case _             => "weekday"
    }
    println(kind)
  }
}

関数内のmatch

よく使われる書き方として、関数本体全体を1つのmatch式にします。マッチングの結果が戻り値になります。

object Main {
  def describe(n: Int): String = n match {
    case 0 => "zero"
    case 1 => "one"
    case _ => "other"
  }
  def main(args: Array[String]): Unit = {
    println(describe(0))
    println(describe(5))
  }
}

値全体のバインド

ワイルドカードケースでcase other =>と記述すると、マッチした値を名前にバインドできます。その分岐内ではotherを使用できます。

object Main {
  def main(args: Array[String]): Unit = {
    val n = 42
    val result = n match {
      case 0     => "nothing"
      case other => s"got $other"
    }
    println(result)
  }
}

順序が重要

ケースは上から下へテストされ、最初に一致したものが採用されます。より具体的なパターンを一般的なパターンより前に置いてください。

ワイルドカードを早い位置に置くと、その下にあるケースが隠れてしまいます。

object Main {
  def main(args: Array[String]): Unit = {
    val n = 1
    val msg = n match {
      case 1 => "specific one"
      case _ => "anything else"
    }
    println(msg)
  }
}

なぜmatchを使うのか

パターンマッチングがScalaの中心的な機能である理由は、次のとおりです。

  • 多方向の分岐を明確に記述できる
  • 式として値を返せる
  • 型、データ構造、ガードへ拡張できる
  • コンパイラーによって網羅性をチェックできる

まとめて使う

これは、リテラル、組み合わせたケース、デフォルトを使った小さな分類器です。

object Main {
  def grade(score: Int): String = score match {
    case 10 | 9 => "excellent"
    case 8 | 7  => "good"
    case _      => "keep trying"
  }
  def main(args: Array[String]): Unit = {
    println(grade(9))
    println(grade(7))
    println(grade(3))
  }
}

理解度チェック

match式についての理解度を確認しましょう。

まとめ

matchの基本を学びました。

  • 構文はvalue match { case pattern => result }
  • _はすべてを受け取るワイルドカード
  • |で値を組み合わせられる
  • matchは値を返す式
  • ケースは上から下へ試され、最初に一致したものが採用される

よくある質問

「match 式」レッスンは無料ですか?

はい。「match 式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「match 式」で何を学びますか?

形状に応じて分岐します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「match 式」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. match 式
  2. 型と値のマッチング
  3. ガードと束縛
  4. デコンストラクション
← Scala for Backend Engineering & Functional Programmingに戻る