型と値のマッチング
型パターンです。
「型と値のマッチング」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- match 式
- 型と値のマッチング
- ガードと束縛
- デコンストラクション