scalabook
35 строк · 1.2 Кб
Контекстные параметры по имени
Контекстные параметры также могут быть объявлены по имени, чтобы избежать использования предполагаемого расширения. Пример:
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 writtens.write(None)
Как и в случае обычного параметра по имени,
аргумент контекстного параметра ev
оценивается по требованию.
В приведенном выше примере, если значение параметра xo
равно None
, оно вообще не вычисляется.
Ссылки: