В выражении o obj "d"
используется комбинация метода расширения через неявное преобразование и инфиксная нотация . Desugared переводится как
augment(o).str("t")
, где augment
определяется как
final class LilaJsObject(private val js: JsObject) extends AnyVal {
def str(key: String): Option[String] =
(js \ key).asOpt[String]
...
}
object LilaJsObject {
implicit def augment(o: JsObject) = new LilaJsObject(o)
}
Эту низкоуровневую реализацию метода расширения можно упростить с помощью неявного классы
implicit final class LilaJsObject(private val js: JsObject) extends AnyVal {
def str(key: String): Option[String] =
(js \ key).asOpt[String]
}
В Scala 3 метод расширения синтаксис становится еще проще.
Попробуйте посмотреть, как безфиксная запись без знаков препинания десагаров выполняется, выполнив
scala -Xprint:parser -e '"Hello" charAt 2'
, который должен отображать "Hello".charAt(2)
. Инфиксная запись может привести к красивым DSL , например,
object repeat {
def it(n: Int) = new {
def times[A](f: => A): Unit = (1 to n).foreach(_ => f)
}
}
can express на почти человеческом языке
repeat it 5 times { println("hello") }