Skip to content

Commit

Permalink
Update implicit-parameters.md in russian
Browse files Browse the repository at this point in the history
  • Loading branch information
artemkorsakov committed Aug 15, 2023
1 parent 1c4898e commit 69ae2ad
Showing 1 changed file with 27 additions and 33 deletions.
60 changes: 27 additions & 33 deletions _ru/tour/implicit-conversions.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,51 +8,45 @@ next-page: polymorphic-methods
previous-page: implicit-parameters
---

Неявные преобразование типа `S` к типу `T` задается неявным значением функционального типа `S =>T`, или неявным методом, который способен преобразовывать к значению требуемого типа.
Неявные преобразования — это мощная функция Scala, применяемая в двух распространенных вариантах:

Неявное преобразование применяются в двух случаях:
- разрешить пользователям предоставлять аргумент одного типа так, как если бы это был другой тип, чтобы избежать шаблонного.
- в Scala 2 для предоставления дополнительных членов запечатанным классам (заменены [методами расширения][exts] в Scala 3).

* Если выражение `e` типа `S` не подходит под ожидаемый тип выражения `T`.
* Если мы выбирая член `e.m`, где `e` является представителем типа `S`, при этом выбранное имя `m` не найдено среди доступных селекторов принадлежащих типу `S`.

В первом случае выполняется поиск приведения `c`, которое можно применить к `e` чтоб тип результата стал соответствовать ожидаемому `T`.
Во втором случае выполняется поиск преобразования `c`, которое применимо к `e` и результат которого бы содержал член с именем `m`.
### Детальный разбор

Если неявный метод `List[A] => Ordered[List[A]]` находится в области видимости, также как и неявный метод `Int => Ordered[Int]`, то следующая операция с двумя списками типа `List[Int]` является допустимой:
{% tabs implicit-conversion-defn class=tabs-scala-version %}
{% tab 'Scala 2' %}

```
List(1, 2, 3) <= List(4, 5)
```
В Scala 2 неявное преобразование из типа `S` в тип `T` определяется либо [неявным классом]({% link _overviews/core/implicit-classes.md %}) `T`
с одним параметром типа `S`, [неявным значением]({% link _tour/implicit-parameters.md %}), которое имеет тип функции `S => T`,
либо неявным методом, преобразуемым в значение этого типа.

Неявный метод `Int => Ordered[Int]` предоставляется автоматически через `scala.Predef.intWrapper`. Ниже приведен пример объявления неявного метода `List[A] => Ordered[List[A]]`.
{% endtab %}
{% tab 'Scala 3' %}

```scala mdoc
import scala.language.implicitConversions
В Scala 3 неявное преобразование из типа `S` в тип `T` определяется [экземпляром `given`]({% link _tour/implicit-parameters.md %}), который имеет тип `scala.Conversion[S, T]`.
Для совместимости со Scala 2 их также можно определить неявным методом (подробнее читайте во вкладке Scala 2).

implicit def list2ordered[A](x: List[A])
(implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
new Ordered[List[A]] {
//заменить на более полезную реализацию
def compare(that: List[A]): Int = 1
}
```
{% endtab %}
{% endtabs %}

Неявно импортируемый объект `scala.Predef` объявляет ряд псевдонимов для часто используемым типов (например, `scala.collection.immutable.Map` использует псевдоним `Map`) и методов (например, `assert`), а также делает доступным целую серию неявных преобразований.
Неявные преобразования применяются в двух случаях:

Например, при вызове Java метода, который ожидает `java.lang.Integer`, вместо него вы можете свободно использовать `scala.Int`. Потому что Predef включает в себя следующие неявные преобразования:
1. Если выражение `e` имеет тип `S` и `S` не соответствует ожидаемому типу выражения `T`.
2. При выборе `e.m`, где `e` типа `S`, если селектор `m` не указывает на элемент `S`.

```scala mdoc
import scala.language.implicitConversions
В первом случае ищется конверсия `c`, применимая к `e` и тип результата которой соответствует `T`.

implicit def int2Integer(x: Int): Integer =
Integer.valueOf(x)
```
Примером является передача `scala.Int`, например `x`, методу, который ожидает `scala.Long`.
В этом случае вставляется неявное преобразование `Int.int2long(x)`.

Компилятор предупреждает при компиляции об обнаружении неявных преобразований, т.к. неявные преобразования могут иметь разные подводные камни (особенно если использовать их без разбора).
Во втором случае ищется преобразование `c`, применимое к `e` и результат которого содержит элемент с именем `m`.

Чтоб отключить предупреждения выполните одно из следующих действий:
Примером является сравнение двух строк `"foo" < "bar"`.
В этом случае `String` не имеет члена `<`, поэтому вставляется неявное преобразование `Predef.augmentString("foo") < "bar"`
(`scala.Predef` автоматически импортируется во все программы Scala).

* Импортируйте `scala.language.implicitConversions` в области видимости, где объявлены неявные преобразования.
* Вызывайте компилятор с ключом `-language:implicitConversions`.
Дополнительная литература: [Неявные преобразования (в книге Scala)]({% link _overviews/scala3-book/ca-implicit-conversions.md %}).

В таком случае при преобразовании компилятором не будет выдаваться никаких предупреждений.
[exts]: {% link _overviews/scala3-book/ca-extension-methods.md %}

0 comments on commit 69ae2ad

Please sign in to comment.