HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: scala, преобразования</p>
1 <p>Теги: scala, преобразования</p>
2 <p>С появлением<a>Extension-методов</a>, потребность в конвертации из одного типа в другой снизилась, однако это не значит, что данная возможность не может быть полезной.</p>
2 <p>С появлением<a>Extension-методов</a>, потребность в конвертации из одного типа в другой снизилась, однако это не значит, что данная возможность не может быть полезной.</p>
3 <p>Давайте представим, что вас есть финансовое программное приложение с case-классами для суммы, зарплаты и налогов в процентах. Естественно, для повышения удобства вы желаете указывать значения данных величин в качестве литерала типа double с дальнейшим неявным преобразованием в типы из предметной области. Посмотрим, как это может выглядеть в<strong>Scala</strong>-интерпретаторе:</p>
3 <p>Давайте представим, что вас есть финансовое программное приложение с case-классами для суммы, зарплаты и налогов в процентах. Естественно, для повышения удобства вы желаете указывать значения данных величин в качестве литерала типа double с дальнейшим неявным преобразованием в типы из предметной области. Посмотрим, как это может выглядеть в<strong>Scala</strong>-интерпретаторе:</p>
4 <p>Итак, сначала мы объявляем, что станем применять<strong>неявные преобразования</strong>, для чего импортируем<strong>implicitConversions</strong>. Потом объявляем 3 case-класса, нужные в нашей предметной области.</p>
4 <p>Итак, сначала мы объявляем, что станем применять<strong>неявные преобразования</strong>, для чего импортируем<strong>implicitConversions</strong>. Потом объявляем 3 case-класса, нужные в нашей предметной области.</p>
5 <p>Дальше можно увидеть новый способ по объявлению неявных преобразований, в котором ключевое слово<strong>given</strong>заменяет старое<strong>implicit def</strong>. Вроде как смысл тот же, но есть нюансы. Например, для каждого объявления осуществляется генерация специального метода. Если же неявное преобразование является анонимным, то и название данного метода тоже автоматически сгенерируется (здесь важно отметить префикс<strong>given_Conversion</strong>, находящийся в имени метода для 1-го преобразования).</p>
5 <p>Дальше можно увидеть новый способ по объявлению неявных преобразований, в котором ключевое слово<strong>given</strong>заменяет старое<strong>implicit def</strong>. Вроде как смысл тот же, но есть нюансы. Например, для каждого объявления осуществляется генерация специального метода. Если же неявное преобразование является анонимным, то и название данного метода тоже автоматически сгенерируется (здесь важно отметить префикс<strong>given_Conversion</strong>, находящийся в имени метода для 1-го преобразования).</p>
6 <p>Продолжаем. Новый абстрактный класс<strong>Conversion</strong>включает в себя метод<strong>apply</strong>, в который, кстати, компилятор подставит тело анонимной функции (идет после =). При этом в случае необходимости вы можете переопределить метод<strong>apply</strong>и явно:</p>
6 <p>Продолжаем. Новый абстрактный класс<strong>Conversion</strong>включает в себя метод<strong>apply</strong>, в который, кстати, компилятор подставит тело анонимной функции (идет после =). При этом в случае необходимости вы можете переопределить метод<strong>apply</strong>и явно:</p>
7 <p>Ключевое слово<strong>with</strong>известно еще с подмешивания трейтов в Scala 2. В нашем случае мы можем интерпретировать его в качестве подмешивания анонимного трейта, переопределяющего реализацию<strong>apply</strong>в классе<strong>Conversion</strong>.</p>
7 <p>Ключевое слово<strong>with</strong>известно еще с подмешивания трейтов в Scala 2. В нашем случае мы можем интерпретировать его в качестве подмешивания анонимного трейта, переопределяющего реализацию<strong>apply</strong>в классе<strong>Conversion</strong>.</p>
8 <p>Также отметим возможность вставлять подчеркивания _ в длинные числовые литералы, что улучшает читаемость. Такое можно видеть и в том же Python.</p>
8 <p>Также отметим возможность вставлять подчеркивания _ в длинные числовые литералы, что улучшает читаемость. Такое можно видеть и в том же Python.</p>
9 <p>Остается добавить, что Scala 3 до сих пор поддерживает implicit-методы из Scala 2. К примеру, ту же конвертацию из Double в Dollars можно записать и таким образом:</p>
9 <p>Остается добавить, что Scala 3 до сих пор поддерживает implicit-методы из Scala 2. К примеру, ту же конвертацию из Double в Dollars можно записать и таким образом:</p>
10 <p><em>По материалам статьи "<a>Scala 3: Contextual Abstractions</a>".</em></p>
10 <p><em>По материалам статьи "<a>Scala 3: Contextual Abstractions</a>".</em></p>
11  
11