デコンストラクション
データから値を取り出します。
「デコンストラクション」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
デコンストラクションとは
デコンストラクション(構造分解とも呼ばれます)とは、データ構造の各要素をパターン内で直接取り出すことです。
アクセサーメソッドを呼び出す代わりに、構造を記述して必要な要素に名前を付けます。
タプルのデコンストラクション
タプルは複数の値をまとめたものです。かっこ内に名前を記述すると、1つのバインドで値を分解して取り出せます。
object Main {
def main(args: Array[String]): Unit = {
val pair = ("Ada", 1815)
val (name, year) = pair
println(s"$name was born in $year")
}
}match内のタプル
match内でタプルをデコンストラクションし、各要素に名前を付けたり、マッチングしたりできます。
object Main {
def quadrant(p: (Int, Int)): String = p match {
case (0, 0) => "origin"
case (x, 0) => s"on x-axis at $x"
case (0, y) => s"on y-axis at $y"
case (x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(quadrant((0, 0)))
println(quadrant((3, 0)))
println(quadrant((2, 5)))
}
}リストの先頭のデコンストラクション
::演算子(cons)は、リストを最初の要素(head)と残り(tail)に分けます。
head :: tailパターンは、空でないすべてのリストにマッチします。
object Main {
def first(xs: List[Int]): String = xs match {
case head :: tail => s"head=$head, rest=$tail"
case Nil => "empty"
}
def main(args: Array[String]): Unit = {
println(first(List(10, 20, 30)))
println(first(Nil))
}
}リストの正確な形状へのマッチング
要素を列挙すると、特定の長さのリストにマッチングできます。たとえばList(a, b)は、要素がちょうど2つのリストにマッチします。
object Main {
def shape(xs: List[Int]): String = xs match {
case List() => "none"
case List(a) => s"one: $a"
case List(a, b) => s"two: $a, $b"
case _ => "many"
}
def main(args: Array[String]): Unit = {
println(shape(List()))
println(shape(List(1)))
println(shape(List(1, 2)))
println(shape(List(1, 2, 3)))
}
}headとtailによる再帰
headとtailに分けると、リストをきれいに再帰処理できます。
ここでは、headをtailの合計に加えてリストの合計を求めています。
object Main {
def sum(xs: List[Int]): Int = xs match {
case Nil => 0
case head :: tail => head + sum(tail)
}
def main(args: Array[String]): Unit = {
println(sum(List(1, 2, 3, 4)))
}
}ネストした構造のデコンストラクション
パターンはネストできます。リスト内のタプルや、タプル内のリストを一度にデコンストラクションできます。
object Main {
def main(args: Array[String]): Unit = {
val data = List(("a", 1), ("b", 2))
data match {
case (key, value) :: _ => println(s"first key=$key value=$value")
case Nil => println("empty")
}
}
}_による要素の無視
関心のない要素には_を使用します。これにより、本当に必要なデータにパターンを集中させられます。
object Main {
def main(args: Array[String]): Unit = {
val triple = (1, 2, 3)
val (_, middle, _) = triple
println(s"middle = $middle")
}
}最初の2要素をバインドして残りを保持
最初の要素に名前を付け、tailパターンでその後のすべての要素を取得できます。
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3, 4, 5)
xs match {
case a :: b :: rest => println(s"a=$a b=$b rest=$rest")
case _ => println("too short")
}
}
}なぜデコンストラクションを使うのか
デコンストラクションを使うと、データへのアクセスが次のようになります。
- 宣言的:手順ではなく構造を記述できる
- 安全:取り出す際に構造がチェックされる
- 簡潔:1つのパターンで複数の値をバインドできる
case classと組み合わせると、さらに強力になります。
まとめて使う
この例では、タプルのリストをデコンストラクションし、その形状に応じて処理します。
object Main {
def report(scores: List[(String, Int)]): String = scores match {
case Nil => "no scores"
case (name, pts) :: Nil => s"only $name with $pts"
case (name, pts) :: rest => s"top $name=$pts plus ${rest.size} more"
}
def main(args: Array[String]): Unit = {
println(report(Nil))
println(report(List(("Ann", 90))))
println(report(List(("Ann", 90), ("Bo", 80))))
}
}理解度チェック
デコンストラクションについての理解度を確認しましょう。
まとめ
パターンでデータをデコンストラクションする方法を学びました。
- タプルは
(a, b)で分割する - リストは
head :: tailまたはList(a, b)のような正確な形状で分割する Nilは空のリストにマッチする- 要素を無視するには
_を使い、深い構造にはパターンをネストする - headとtailへの分割によって、きれいな再帰処理が可能になる
よくある質問
「デコンストラクション」レッスンは無料ですか?
はい。「デコンストラクション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「デコンストラクション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。