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

デコンストラクション

データから値を取り出します。

「デコンストラクション」は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フィードバックを取得できます。ローカル設定は不要です。

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

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