Неявные преобразования в Scala
С появлением Extension-методов, потребность в конвертации из одного типа в другой снизилась, однако это не значит, что данная возможность не может быть полезной.
Давайте представим, что вас есть финансовое программное приложение с case-классами для суммы, зарплаты и налогов в процентах. Естественно, для повышения удобства вы желаете указывать значения данных величин в качестве литерала типа double с дальнейшим неявным преобразованием в типы из предметной области. Посмотрим, как это может выглядеть в Scala-интерпретаторе:
Итак, сначала мы объявляем, что станем применять неявные преобразования, для чего импортируем implicitConversions. Потом объявляем 3 case-класса, нужные в нашей предметной области.
Дальше можно увидеть новый способ по объявлению неявных преобразований, в котором ключевое слово given заменяет старое implicit def. Вроде как смысл тот же, но есть нюансы. Например, для каждого объявления осуществляется генерация специального метода. Если же неявное преобразование является анонимным, то и название данного метода тоже автоматически сгенерируется (здесь важно отметить префикс given_Conversion, находящийся в имени метода для 1-го преобразования).
Продолжаем. Новый абстрактный класс Conversion включает в себя метод apply, в который, кстати, компилятор подставит тело анонимной функции (идет после
Ключевое слово with известно еще с подмешивания трейтов в Scala 2. В нашем случае мы можем интерпретировать его в качестве подмешивания анонимного трейта, переопределяющего реализацию apply в классе Conversion.
Также отметим возможность вставлять подчеркивания
Остается добавить, что Scala 3 до сих пор поддерживает implicit-методы из Scala 2. К примеру, ту же конвертацию из Double в Dollars можно записать и таким образом:
По материалам статьи "Scala 3: Contextual Abstractions".