Неявные преобразования в Scala | OTUS

Неявные преобразования в Scala

С появлением Extension-методов, потребность в конвертации из одного типа в другой снизилась, однако это не значит, что данная возможность не может быть полезной.

Давайте представим, что вас есть финансовое программное приложение с case-классами для суммы, зарплаты и налогов в процентах. Естественно, для повышения удобства вы желаете указывать значения данных величин в качестве литерала типа double с дальнейшим неявным преобразованием в типы из предметной области. Посмотрим, как это может выглядеть в Scala-интерпретаторе:

1-20219-8878c0.png

Итак, сначала мы объявляем, что станем применять неявные преобразования, для чего импортируем implicitConversions. Потом объявляем 3 case-класса, нужные в нашей предметной области.

Дальше можно увидеть новый способ по объявлению неявных преобразований, в котором ключевое слово given заменяет старое implicit def. Вроде как смысл тот же, но есть нюансы. Например, для каждого объявления осуществляется генерация специального метода. Если же неявное преобразование является анонимным, то и название данного метода тоже автоматически сгенерируется (здесь важно отметить префикс given_Conversion, находящийся в имени метода для 1-го преобразования).

Продолжаем. Новый абстрактный класс Conversion включает в себя метод apply, в который, кстати, компилятор подставит тело анонимной функции (идет после =). При этом в случае необходимости вы можете переопределить метод apply и явно:

2-20219-050907.png

Ключевое слово with известно еще с подмешивания трейтов в Scala 2. В нашем случае мы можем интерпретировать его в качестве подмешивания анонимного трейта, переопределяющего реализацию apply в классе Conversion.

Также отметим возможность вставлять подчеркивания _ в длинные числовые литералы, что улучшает читаемость. Такое можно видеть и в том же Python.

Остается добавить, что Scala 3 до сих пор поддерживает implicit-методы из Scala 2. К примеру, ту же конвертацию из Double в Dollars можно записать и таким образом:

3-20219-e8ce21.png

По материалам статьи "Scala 3: Contextual Abstractions".

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто