Permalink
Browse files

Update operator-overloading.md

  • Loading branch information...
Temon137 committed Jun 20, 2017
1 parent aee33af commit 1e14ef2f2d9750ff877280fb6d49a57d23121bed
Showing with 26 additions and 26 deletions.
  1. +26 −26 operator-overloading.md
View
@@ -16,7 +16,7 @@ Functions that overload operators need to be marked with the `operator` modifier
Further we describe the conventions that regulate operator overloading for different operators. -->
Язык Kotlin позволяет нам реализовывать предопределённый набор операторов для наших типов. Эти операторы имеют фиксированное символическое представление (вроде `+` или `*`) и фиксированные [приоритеты](grammar.html#precedence). Для реализации оператора, мы предоставляем [функцию-член](functions.html#member-functions) или [функцию-расширение](extensions.html) с фиксированным именем и с соответствующим типом, т. е. левосторонним типом для бинарных операций или типом аргумента для унарных оперций. Функции, которые перегружают операторы должны быть отмечены модификатором `operator`.
Язык Kotlin позволяет нам реализовывать предопределённый набор операторов для наших типов. Эти операторы имеют фиксированное символическое представление (вроде `+` или `*`) и фиксированные [приоритеты](grammar.html#precedence). Для реализации оператора мы предоставляем [функцию-член](functions.html#member-functions) или [функцию-расширение](extensions.html) с фиксированным именем и с соответствующим типом, т. е. левосторонним типом для бинарных операций или типом аргумента для унарных оперций. Функции, которые перегружают операторы, должны быть отмечены модификатором `operator`.
Далее мы опишем соглашения, которые регламентируют перегрузку операторов для разных типов операторов.
@@ -26,34 +26,34 @@ Further we describe the conventions that regulate operator overloading for diffe
<!-- ### Unary prefix operators -->
| Expression | Translated to |
| Выражение | Транслируется в |
|------------|---------------|
| `+a` | `a.unaryPlus()` |
| `-a` | `a.unaryMinus()` |
| `!a` | `a.not()` |
<!--This table says that when the compiler processes, for example, an expression `+a`, it performs the following steps:-->
Эта таблица демонстрирует, что когда компилятор обрабатывает, к примеру, выражение `+a`, он оcуществляет следующие дейстрия:
Эта таблица демонстрирует, что когда компилятор обрабатывает, к примеру, выражение `+a`, он оcуществляет следующие действия:
<!--
Determines the type of `a`, let it be `T`.
Looks up a function `unaryPlus()` with the `operator` modifier and no parameters for the receiver `T`, i.e. a member function or an extension function.
If the function is absent or ambiguous, it is a compilation error.
If the function is present and its return type is `R`, the expression `+a` has type `R`.
-->
* Определяется тип выражения `a`, пусть это будет `T`
* Смотрится функция `unaryPlus()` с модификатором `operator` без параметров для приемника типа `Т`, т. е. функция-член или функция расширения.
* Если функция отсутствует или неоднозная, то это ошибка компиляции.
* Определяется тип выражения `a`, пусть это будет `T`.
* Смотрится функция `unaryPlus()` с модификатором `operator` без параметров для приёмника типа `Т`, т. е. функция-член или функция расширения.
* Если функция отсутствует или неоднозначная, то это ошибка компиляции.
* Если функция присутствует и её возвращаемый тип есть `R`, выражение `+a` имеет Тип `R`.
<!--*Note* that these operations, as well as all the others, are optimized for [Basic types](basic-types.html) and do not introduce overhead of function calls for them. -->
*Примечание*, эти операции, как и все остальные, оптимизированы для [основных типов](basic-types.html) и не вносят накладных расходов на вызовы этих функций для них.
*Примечание*: эти операции, как и все остальные, оптимизированы для [основных типов](basic-types.html) и не вносят накладных расходов на вызовы этих функций для них.
<!--### Increments and decrements -->
### Инкремент и декремент
| Expression | Translated to |
| Выражение | Транслируется в |
|------------|---------------|
| `a++` | `a.inc()` + see below |
| `a--` | `a.dec()` + see below |
@@ -70,8 +70,8 @@ Further we describe the conventions that regulate operator overloading for diffe
* Checks that the return type of the function is a subtype of `T`. -->
Компилятор осуществляет следующие шаги для разрешения операторов в *постфиксной* форме, например для `a++`:
* Определяется тип переменной `a`, пусть это будет `T`
* Смотрится функция `inc()` с модификатором `operator` без параметров, применимая для приемника типа `Т`.
* Определяется тип переменной `a`, пусть это будет `T`.
* Смотрится функция `inc()` с модификатором `operator` без параметров, применимая для приёмника типа `Т`.
* Проверяется, что возвращаемый тип такой функции является подтипом `T`.
<!--The effect of computing the expression is:
@@ -82,7 +82,7 @@ Further we describe the conventions that regulate operator overloading for diffe
Эффектом вычисления будет:
* Загружается инициализирующее значение `a` во временную переменную `a0`,
* Результат выполнения `a.inc()` to `a`,
* Результат выполнения `a.inc()` сохраняется в `a`,
* Возвращается `a0` как результат вычисления выражения (т.е. значение до инкремента).
<!-- For `a--` the steps are completely analogous. -->
@@ -104,7 +104,7 @@ Further we describe the conventions that regulate operator overloading for diffe
<!--### Arithmetic operators -->
### Арифметические операции
| Expression | Translated to |
| Выражение | Транслируется в |
| -----------|-------------- |
| `a + b` | `a.plus(b)` |
| `a - b` | `a.minus(b)` |
@@ -115,18 +115,18 @@ Further we describe the conventions that regulate operator overloading for diffe
<!--For the operations in this table, the compiler just resolves the expression in the *Translated to* column.-->
Для перечисленных в таблице операций компилятор всего лишь разрешает выражение в вызов функции из колонки *Translated to*.
Для перечисленных в таблице операций компилятор всего лишь разрешает выражение из колонки *Транслируется в*.
<!--Note that the `rem` operator is supported since Kotlin 1.1. Kotlin 1.0 uses the `mod` operator, which is deprecated
in Kotlin 1.1.-->
Отметим, что операция `rem` поддерживается только начиная с Kotlin 1.1. Kotlin 1.0 использует только операцию `mod`, которая отмечена как устаревшая в in Kotlin 1.1.
Отметим, что операция `rem` поддерживается только начиная с Kotlin 1.1. Kotlin 1.0 использует только операцию `mod`, которая отмечена как устаревшая в Kotlin 1.1.
<a name="in"></a>
<!--### 'In' operator -->
### Оператор in
| Expression | Translated to |
| Выражение | Транслируется в |
| -----------|-------------- |
| `a in b` | `b.contains(a)` |
| `a !in b` | `!b.contains(a)` |
@@ -139,7 +139,7 @@ in Kotlin 1.1.-->
<!--### Indexed access operator-->
### Оператор доступа по индексу
| Expression | Translated to |
| Выражение | Транслируется в |
| -------|-------------- |
| `a[i]` | `a.get(i)` |
| `a[i, j]` | `a.get(i, j)` |
@@ -156,22 +156,22 @@ in Kotlin 1.1.-->
<!--### Invoke operator-->
### Оператор вызова
| Expression | Translated to |
| Выражение | Транслируется в |
|--------|---------------|
| `a()` | `a.invoke()` |
| `a(i)` | `a.invoke(i)` |
| `a(i, j)` | `a.invoke(i, j)` |
| `a(i_1, ..., i_n)` | `a.invoke(i_1, ..., i_n)` |
<!--Parentheses are translated to calls to `invoke` with appropriate number of arguments.-->
Оператора вызова (функции, метода) в круглых скобках транслируется в `invoke` с соответствующим числом аргументов.
Оператор вызова (функции, метода) в круглых скобках транслируется в `invoke` с соответствующим числом аргументов.
<a name="assignments"></a>
<!--### Augmented assignments-->
### Присвоения с накоплением
| Expression | Translated to |
| Выражение | Транслируется в |
|------------|---------------|
| `a += b` | `a.plusAssign(b)` |
| `a -= b` | `a.minusAssign(b)` |
@@ -191,10 +191,10 @@ in Kotlin 1.1.-->
-->
* Если функция из правой колонки таблицы доступна
* Если соответствующая бинарная функция (т.е. `plus()` для `plusAssign()`) также доступна, то фиксируется ошибка (неоднозначность).
* Проверяется, что возвращаемое значение функции `Unit`, в противном случае фиксируется ошибка.
* Генерируется код для `a.plusAssign(b)`
* В противном случае, делается попытка сгенерировать код для `a = a + b` (при этом включается проверка типов: тип выражения `a + b` должен быть подтипом `a`).
* Если соответствующая бинарная функция (т.е. `plus()` для `plusAssign()`) также доступна, то фиксируется ошибка (неоднозначность).
* Проверяется, что возвращаемое значение функции `Unit`, в противном случае фиксируется ошибка.
* Генерируется код для `a.plusAssign(b)`
* В противном случае делается попытка сгенерировать код для `a = a + b` (при этом включается проверка типов: тип выражения `a + b` должен быть подтипом `a`).
<!--*Note*: assignments are *NOT* expressions in Kotlin.-->
*Отметим*: присвоение *НЕ ЯВЛЯЕТСЯ* выражением в Kotlin.
@@ -204,7 +204,7 @@ in Kotlin 1.1.-->
<!--### Equality and inequality operators-->
### Операторы равенства и неравенства
| Expression | Translated to |
| Выражение | Транслируется в |
|------------|---------------|
| `a == b` | `a?.equals(b) ?: (b === null)` |
| `a != b` | `!(a?.equals(b) ?: (b === null))` |
@@ -222,15 +222,15 @@ in Kotlin 1.1.-->
<!--### Comparison operators-->
### Операторы сравнений
| Expression | Translated to |
| Выражение | Транслируется в |
|--------|---------------|
| `a > b` | `a.compareTo(b) > 0` |
| `a < b` | `a.compareTo(b) < 0` |
| `a >= b` | `a.compareTo(b) >= 0` |
| `a <= b` | `a.compareTo(b) <= 0` |
<!--All comparisons are translated into calls to `compareTo`, that is required to return `Int`.-->
Все сравения транслируются в вызовы `compareTo`, от которых требуется, чтобы они возвращали значение `Int`.
Все сравнения транслируются в вызовы `compareTo`, от которых требуется, чтобы они возвращали значение `Int`.
<!--## Infix calls for named functions-->
## Инфиксные вызовы именованных функций

0 comments on commit 1e14ef2

Please sign in to comment.