HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: методы, extension, scala, имплиситы</p>
1 <p>Теги: методы, extension, scala, имплиситы</p>
2 <p>Один из вариантов создания кортежа из 2-х элементов - применение<strong>a -&gt; b</strong>, что является альтернативой всем привычного<strong>(a, b)</strong>. В Scala 2-й версии это имплементировано посредством неявного преобразования из типа переменной<strong>a</strong>в<strong>ArrowAssoc</strong>, где определен метод<strong>-&gt;</strong>:</p>
2 <p>Один из вариантов создания кортежа из 2-х элементов - применение<strong>a -&gt; b</strong>, что является альтернативой всем привычного<strong>(a, b)</strong>. В Scala 2-й версии это имплементировано посредством неявного преобразования из типа переменной<strong>a</strong>в<strong>ArrowAssoc</strong>, где определен метод<strong>-&gt;</strong>:</p>
3 <p>На что тут важно обратить внимание? На то, что юникодовская стрелочка<strong>→</strong>помечается как<strong>deprecated</strong>.</p>
3 <p>На что тут важно обратить внимание? На то, что юникодовская стрелочка<strong>→</strong>помечается как<strong>deprecated</strong>.</p>
4 <p>Все это является довольно типичным для Scala 2: если есть желание, чтобы метод казался частью типа, надо сделать неявное преобразование к типу-обертке, предоставляющему этот метод.</p>
4 <p>Все это является довольно типичным для Scala 2: если есть желание, чтобы метод казался частью типа, надо сделать неявное преобразование к типу-обертке, предоставляющему этот метод.</p>
5 <p>Иными словами, в Scala 2 для этого задействуется универсальный механизм<strong>имплиситов</strong>, что позволяет достичь конкретной цели: появления<strong>extension</strong>-метода. Кстати, именно таким образом в других языках программирования (в том же C#) называют способ добавления к типу метода, объявленного вне этого типа.</p>
5 <p>Иными словами, в Scala 2 для этого задействуется универсальный механизм<strong>имплиситов</strong>, что позволяет достичь конкретной цели: появления<strong>extension</strong>-метода. Кстати, именно таким образом в других языках программирования (в том же C#) называют способ добавления к типу метода, объявленного вне этого типа.</p>
6 <p>Но перейдем к<strong>Scala 3</strong>-- здесь extension-методы становятся сущностями 1-го класса. Давайте посмотрим, как мы можем переписать<strong>ArrowAssoc</strong>, применяя<strong>~&gt;</strong>в качестве имени метода:</p>
6 <p>Но перейдем к<strong>Scala 3</strong>-- здесь extension-методы становятся сущностями 1-го класса. Давайте посмотрим, как мы можем переписать<strong>ArrowAssoc</strong>, применяя<strong>~&gt;</strong>в качестве имени метода:</p>
7 <p>Поначалу у нас идет ключевое слово<strong>extension</strong>, далее -- типы-параметры (в нашем случае - это<strong>[A, B]</strong>). Таким образом,<strong>A</strong>представляет собой тип, который мы расширяем, причем значение<strong>a</strong>дает возможность сослаться на экземпляр этого типа, для которого и был вызван наш<strong>extension</strong>-метод (аналог<strong>this</strong>). Также учтите, что в примере применяется бесскобочный синтаксис. Ну и после ключевого слова<strong>extension</strong>вы можете указать сколько хотите методов.</p>
7 <p>Поначалу у нас идет ключевое слово<strong>extension</strong>, далее -- типы-параметры (в нашем случае - это<strong>[A, B]</strong>). Таким образом,<strong>A</strong>представляет собой тип, который мы расширяем, причем значение<strong>a</strong>дает возможность сослаться на экземпляр этого типа, для которого и был вызван наш<strong>extension</strong>-метод (аналог<strong>this</strong>). Также учтите, что в примере применяется бесскобочный синтаксис. Ну и после ключевого слова<strong>extension</strong>вы можете указать сколько хотите методов.</p>
8 <p>Отдельного упоминания в Scala 3 заслуживает аннотация<strong>@targetName</strong>. Посредством ее вы сможете определить буквенно-цифровое имя для методов, которые выполняют в Scala роль операторов. Причем данное имя нельзя будет применять из Scala-кода (нельзя будет написать<strong>a.arrow2(b)</strong>), зато можно будет использовать из Java-кода, чтобы вызвать соответствующий метод. Собственно говоря, применение аннотации<strong>@targetName</strong>рекомендуют сегодня для всех "операторных" методов.</p>
8 <p>Отдельного упоминания в Scala 3 заслуживает аннотация<strong>@targetName</strong>. Посредством ее вы сможете определить буквенно-цифровое имя для методов, которые выполняют в Scala роль операторов. Причем данное имя нельзя будет применять из Scala-кода (нельзя будет написать<strong>a.arrow2(b)</strong>), зато можно будет использовать из Java-кода, чтобы вызвать соответствующий метод. Собственно говоря, применение аннотации<strong>@targetName</strong>рекомендуют сегодня для всех "операторных" методов.</p>
9 <p><em>По материалам статьи "<a>Scala 3: Contextual Abstractions</a>".</em></p>
9 <p><em>По материалам статьи "<a>Scala 3: Contextual Abstractions</a>".</em></p>
10  
10