В его сердце implicit
является способом расширения поведения значений типа таким образом, который полностью контролируется на локальном уровне в вашей программе и является внешним по отношению к исходному коду, который определяет эти значения. Это один из способов решения проблемы expression problem.
Это позволяет вам сосредоточить свои основные классы на их самой фундаментальной структуре и поведении и учитывать поведение более высокого уровня. Он используется для достижения специального полиморфизма, где два формально несвязанных типа данных могут быть легко адаптированы к одному и тому же интерфейсу, так что их можно рассматривать как экземпляры одного и того же типа.
Например, вместо классов моделей данных, содержащих поведение сериализации JSON, вы можете сохранить это поведение в другом месте и неявно увеличить объект с возможностью сериализации. Это сводится к определению в экземпляре implicit
, в котором указано, как ваш объект можно рассматривать как «сериализуемый JSON», а не его оригинальный тип, и он выполняется без редактирования реального типа объекта.
Существует несколько форм implicit
, которые являются pretty thoroughly covered elsewhere. Варианты использования включают в себя расширение шаблона my-library, шаблон typeclass, неявные преобразования и инъекции зависимостей.
Что действительно интересно для меня в контексте этого вопроса, так это то, как это отличается от подходов на других языках.
Enhance-моя библиотека и классы типов
Во многих других языках, вы выполнить это обезьяна заплат (обычно там, где нет проверки типа) или методы расширения. Эти подходы имеют недостаток в составлении непредсказуемо и применительно к глобальным. В статически типизированных языках без способа открытия классов вам обычно приходится делать явные адаптеры. Это имеет недостаток большого количества шаблонов. Как в статическом, так и в динамическом языках вы также можете использовать отражение, но обычно с большим количеством церемоний и сложности.
В Haskell модельные категории существуют как первоклассная концепция. Тем не менее, они глобальны, так что вы не получаете локальный контроль над тем, какой тип класса применяется в данной ситуации. В Scala вы контролируете, какие импликации находятся в области локально, через импортируемые модули. И вы всегда можете полностью отказаться от неявного разрешения, явно передавая параметры.
Люди выступают за глобальное или местное разрешение типов товаров так или иначе, в зависимости от того, кого вы спрашиваете.
Неявных преобразований
Много других языков не имеют возможностей для достижения этой цели. Но в Скале это стало нахмуриться, так что, возможно, это справедливо.
Им нужно было получить http://scalapuzzlers.com/ с земли. –
Святое Я не понимал, сколько головоломок есть у Скалы. – Ana
Этот вопрос допускает много плохих ответов, но также хороших и лаконичных. –