Контекстные параметры по имени

Контекстные параметры также могут быть объявлены по имени, чтобы избежать использования предполагаемого расширения. Пример:

trait Codec[T]:
  def write(x: T): Unit

given intCodec: Codec[Int] =
  (x: Int) => println(s"$x has been written")

given optionCodec[T](using ev: => Codec[T]): Codec[Option[T]] with
  def write(xo: Option[T]) = xo match
    case Some(x) => ev.write(x)
    case None =>

val s = summon[Codec[Option[Int]]]

s.write(Some(33))
// 33 has been written
s.write(None)

Как и в случае обычного параметра по имени, аргумент контекстного параметра ev оценивается по требованию. В приведенном выше примере, если значение параметра xo равно None, оно вообще не вычисляется.


Ссылки: