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フィードバックを取得できます。ローカル設定は不要です。