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

Scala 3 の given/using

現代的な構文です。

「Scala 3 の given/using」は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レッスンが含まれています。

Scala 3の現代的な暗黙の値

Scala 3では、用途が多かったimplicitキーワードを、より明確な構文に置き換えています。givenは暗黙の値を定義し、usingは暗黙のパラメーターを宣言します。意図がはるかに読み取りやすくなります。

object Main:
  given greeting: String = "Hello"
  def greet(name: String)(using g: String): String = s"$g, $name!"
  def main(args: Array[String]): Unit =
    println(greet("Ann"))

implicit valをgivenに置き換える

Scala 2でimplicit val x: T = ...と書いていた箇所は、Scala 3ではgiven x: T = ...と書きます。これにより、暗黙の解決に利用できる値を宣言します。

object Main:
  given factor: Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))

暗黙のパラメーターをusingに置き換える

using節は、パラメーターリストを暗黙のものとしてマークします。コンパイラーは、スコープ内にある一致するgivenから値を補います。

object Main:
  given unit: String = "kg"
  def label(n: Int)(using u: String): String = s"$n$u"
  def main(args: Array[String]): Unit =
    println(label(75))

名前のないgiven

直接参照する必要がない場合は、givenの名前を省略できます。コンパイラーは型によって引き続きその値を見つけます。

object Main:
  given Int = 3
  def triple(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(triple(7))

summonで値を取得する

Scala 3のsummon[T]はimplicitly[T]に取って代わります。型Tのgiven値を直接取得します。

object Main:
  given name: String = "Scala 3"
  def main(args: Array[String]): Unit =
    val n = summon[String]
    println(n)

名前のないusingパラメーター

usingパラメーターを転送するだけでよい場合は、節内で名前を省略できます。(using Int)のように書き、内部ではsummonで取得します。

object Main:
  given Int = 100
  def boosted(x: Int)(using Int): Int = x + summon[Int]
  def main(args: Array[String]): Unit =
    println(boosted(5))

型クラスに対するgiven

given/usingの最も慣用的な用途は型クラスです。traitを定義し、givenインスタンスを提供して、usingでそれを要求します。

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[Int] with
    def show(a: Int): String = s"Int($a)"

  def display[A](a: A)(using s: Show[A]): String = s.show(a)

  def main(args: Array[String]): Unit =
    println(display(42))

コンテキスト境界は引き続き使える

コンテキスト境界[A: Show]は引き続き利用でき、usingパラメーターに展開されます。summonと組み合わせてインスタンスにアクセスできます。

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[String] with
    def show(a: String): String = s"Str($a)"

  def display[A: Show](a: A): String = summon[Show[A]].show(a)

  def main(args: Array[String]): Unit =
    println(display("hi"))

using引数を明示的に渡す

呼び出し側でusingキーワードを使えば、usingパラメーターを明示的に渡し、スコープ内のgivenを上書きできます。

object Main:
  given Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))
    println(scale(5)(using 2))

givenのインポート

Scala 3にはgivenをインポートする専用構文があります。import pkg.givenまたはimport pkg.{given Show[Int]}と書きます。これにより、暗黙のインポートであることが明示され、意図が伝わります。

object Instances:
  given Int = 5

object Main:
  import Instances.given
  def addBase(x: Int)(using b: Int): Int = x + b
  def main(args: Array[String]): Unit =
    println(addBase(10))

新しい構文が導入された理由

Scala 2では、1つのimplicitキーワードが複数の異なる意味を持っていました。Scala 3では概念を分け、givenは「提供」、usingは「要求」を表します。コードが明確になり、エラーも理解しやすくなります。

object Main:
  given pi: Double = 3.14159
  def area(r: Double)(using p: Double): Double = p * r * r
  def main(args: Array[String]): Unit =
    println(area(2.0))

クイックチェック

Scala 3では、値の提供と要求に使うimplicitを、それぞれどのキーワードに置き換えますか。

まとめ

Scala 3のgiven/usingについて学びました。

  • givenは暗黙の値を提供します(implicit valの置き換え)
  • usingは暗黙のパラメーターを宣言します
  • summon[T]はimplicitly[T]に置き換わります
  • givenは名前を省略でき、型クラスに適しています
  • import pkg.givenで明示的にインポートできます

よくある質問

「Scala 3 の given/using」レッスンは無料ですか?

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

「Scala 3 の given/using」で何を学びますか?

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

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

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

「Scala 3 の given/using」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 暗黙のパラメーター
  2. Scala 3 の given/using
  3. 暗黙の変換
  4. 拡張メソッド
← Scala for Backend Engineering & Functional Programmingに戻る