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

型と値のマッチング

型パターンです。

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

型パターン

リテラル値とのマッチングだけでなく、matchでは値の型によって分岐できます。これを型パターンと呼びます。

case x: Type =>と記述すると、値がその型である場合に分岐が実行され、値がxにバインドされます。

型によるマッチング

値の型がAnyのような一般的な型であっても、型パターンによって具体的な型を判別できます。

それぞれのcase x: Tで、実行時の型がチェックされます。

object Main {
  def describe(x: Any): String = x match {
    case i: Int    => "an Int"
    case s: String => "a String"
    case _         => "something else"
  }
  def main(args: Array[String]): Unit = {
    println(describe(5))
    println(describe("hi"))
    println(describe(3.14))
  }
}

バインドした値の使用

バインドした名前にはマッチした型が付くため、その分岐内でその型のメソッドを安全に呼び出せます。

キャストは必要ありません。コンパイラーがケース内の型を把握しているためです。

object Main {
  def shout(x: Any): String = x match {
    case s: String => s.toUpperCase
    case i: Int    => (i * 2).toString
    case _         => "?"
  }
  def main(args: Array[String]): Unit = {
    println(shout("hello"))
    println(shout(21))
  }
}

型と値の組み合わせ

同じmatch内で、値パターンと型パターンを組み合わせられます。通常、値パターンのほうが具体的なので、先に配置してください。

object Main {
  def check(x: Any): String = x match {
    case 0       => "zero int"
    case i: Int  => s"nonzero int $i"
    case _       => "not an int"
  }
  def main(args: Array[String]): Unit = {
    println(check(0))
    println(check(7))
    println(check("x"))
  }
}

DoubleとBooleanのマッチング

型パターンは、Double、Boolean、Charなど、あらゆる型で使用できます。

object Main {
  def kind(x: Any): String = x match {
    case d: Double  => s"double $d"
    case b: Boolean => s"bool $b"
    case _          => "other"
  }
  def main(args: Array[String]): Unit = {
    println(kind(2.5))
    println(kind(true))
  }
}

コレクションの型によるマッチング

Listのようなコンテナ型にもマッチングできます。ここでは、リストとその他の値を区別します。

object Main {
  def info(x: Any): String = x match {
    case l: List[_] => s"a list of size ${l.size}"
    case _          => "not a list"
  }
  def main(args: Array[String]): Unit = {
    println(info(List(1, 2, 3)))
    println(info("nope"))
  }
}

よくある用途:Anyの処理

型パターンは、関数がAnyを受け取り、型ごとに異なる処理(ロギングやシリアライズなど)を行う必要がある場合に特に役立ちます。

object Main {
  def render(x: Any): String = x match {
    case i: Int    => s"int=$i"
    case d: Double => s"dbl=$d"
    case s: String => s"str=$s"
    case _         => "unknown"
  }
  def main(args: Array[String]): Unit = {
    List(1, 2.0, "three").foreach(v => println(render(v)))
  }
}

ここでも順序が重要

すべてのマッチングと同様に、型パターンも上から下へチェックされます。より広い型を先に置くと、その下にあるより狭い型が隠れてしまいます。

必ず、最も具体的なものから最も一般的なものの順に並べてください。

object Main {
  def label(x: Any): String = x match {
    case s: String => "string first"
    case _: Any    => "anything"
  }
  def main(args: Array[String]): Unit = {
    println(label("hi"))
    println(label(99))
  }
}

型消去に関する注意

実行時には、ジェネリック型パラメーターが消去されます。そのため、List[Int]とList[String]は同じように見えます。List[Int]とのマッチングで確認できるのは、Listであることだけです。

明示的に指定して警告を避けるには、List[_]を使用してください。

なぜ型パターンを使うのか

型パターンを使うと、次のことができます。

  • キャストせずに一般的な型を安全に絞り込む
  • 異なる型の値をすっきり処理する
  • 値パターンやガードと組み合わせる

型パターンは、case classやADTへのマッチングを学ぶための足がかりになります。

まとめて使う

値パターンと型パターンを組み合わせて、混在した入力を分類します。

object Main {
  def classify(x: Any): String = x match {
    case 0          => "zero"
    case i: Int     => "int"
    case s: String  => "text of length " + s.length
    case _          => "other"
  }
  def main(args: Array[String]): Unit = {
    println(classify(0))
    println(classify(5))
    println(classify("hey"))
  }
}

理解度チェック

型パターンについての知識を確認しましょう。

まとめ

型によるマッチングを学びました。

  • case x: Typeは実行時の型でマッチングし、xにバインドする
  • バインドした値にはマッチした型が付くため、キャストは不要
  • 値パターンと型パターンを組み合わせ、具体的なものを先に置く
  • ジェネリックパラメーターは消去されるため、List[_]を使う

よくある質問

「型と値のマッチング」レッスンは無料ですか?

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

「型と値のマッチング」で何を学びますか?

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

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

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

「型と値のマッチング」レッスンにはどのくらい時間がかかりますか?

ほとんどの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に戻る