Описание тега implicit
В Scala есть два варианта имплицитов: неявные преобразования и неявные параметры.
Неявные преобразования применяются компилятором scala, когда он встречает выражение, которое он не может скомпилировать, но которое может быть скомпилировано, когда один из элементов передается в функцию, а возвращаемое значение используется вместо исходного элемента. Типичным вариантом использования является шаблон обогащения моей библиотеки.
Например, Scala допускает синтаксис "some.*regexp".r
хотя литерал между кавычками - это String, а String не имеет метода r
. Но в Predef есть метод:augmentString(x: String): StringOps
а также StringOps
имеет r
метод. Итак, это неявное преобразование применяется.
Неявные параметры - это параметры, которые добавляются к вызову метода компилятором. Несколько известный вариант использования - библиотека коллекций. Многие методы принимаютCanBuildFrom
параметр, который используется для определения типа коллекции, возвращаемой методом. В большинстве случаев этот параметр не указывается явно, но используется неявное значение по умолчанию, которое позволяет библиотеке коллекций возвращать "правильную" специализированную коллекцию.
Только поля, отмеченные как таковые, рассматриваются для использования в качестве неявных параметров или преобразований.
Хотя эта функция позволяет создавать мощные, краткие и безопасные по типу DSL и другие API, ее следует использовать с осторожностью, поскольку она также позволяет создавать код, который довольно сложно понять.