Skip to content

Commit 441d8a9

Browse files
Refresh _ru/tour/default-parameter-values.md (#2783)
1 parent 9ea05b2 commit 441d8a9

File tree

1 file changed

+57
-1
lines changed

1 file changed

+57
-1
lines changed

_ru/tour/default-parameter-values.md

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ previous-page: classes
99
prerequisite-knowledge: named-arguments, function syntax
1010
---
1111

12-
Scala предоставляет возможность задавать значения параметров по умолчанию, что позволяет лишний раз не указывать параметры.
12+
Scala предоставляет возможность задавать значения параметров по умолчанию, что позволяет лишний раз не указывать параметры.
13+
14+
{% tabs default-parameter-values-1 %}
15+
{% tab 'Scala 2 и 3' for=default-parameter-values-1 %}
1316

1417
```scala mdoc
1518
def log(message: String, level: String = "INFO") = println(s"$level: $message")
@@ -18,22 +21,41 @@ log("System starting") // выведет "INFO: System starting"
1821
log("User not found", "WARNING") // выведет "WARNING: User not found"
1922
```
2023

24+
{% endtab %}
25+
{% endtabs %}
26+
2127
У параметра `level` есть значение по умолчанию, поэтому он необязателен. В последней строке аргумент `"WARNING"` переназначает аргумент по умолчанию `"INFO"`. Вместо того чтоб использовать перегруженные методы в Java, вы можете просто указать дополнительные параметры как параметры по умолчанию для достижения того же эффекта. Однако, если при вызове пропущен хотя бы один аргумент, все остальные аргументы должны вызываться с указанием конкретного имени аргумента.
2228

29+
{% tabs default-parameter-values-2 %}
30+
{% tab 'Scala 2 и 3' for=default-parameter-values-2 %}
31+
2332
```scala mdoc
2433
class Point(val x: Double = 0, val y: Double = 0)
2534

2635
val point1 = new Point(y = 1)
2736
```
37+
38+
{% endtab %}
39+
{% endtabs %}
40+
2841
Так мы можем указать что `y = 1`.
2942

3043
Обратите внимание, что параметры по умолчанию в Scala, при вызове из Java кода, являются обязательными:
3144

45+
{% tabs default-parameter-values-3 %}
46+
{% tab 'Scala 2 и 3' for=default-parameter-values-3 %}
47+
3248
```scala mdoc:reset
3349
// Point.scala
3450
class Point(val x: Double = 0, val y: Double = 0)
3551
```
3652

53+
{% endtab %}
54+
{% endtabs %}
55+
56+
{% tabs default-parameter-values-4 %}
57+
{% tab 'Java' for=default-parameter-values-4 %}
58+
3759
```java
3860
// Main.java
3961
public class Main {
@@ -42,3 +64,37 @@ public class Main {
4264
}
4365
}
4466
```
67+
68+
{% endtab %}
69+
{% endtabs %}
70+
71+
### Параметры по умолчанию для перегруженных методов
72+
73+
Scala не позволяет определять два метода с параметрами по умолчанию и с одинаковым именем (перегруженные методы).
74+
Важная причина этого - избежание двусмысленности, которая может быть вызвана наличием параметров по умолчанию.
75+
Чтобы проиллюстрировать проблему, давайте рассмотрим определение методов, представленных ниже:
76+
77+
{% tabs default-parameter-values-5 class=tabs-scala-version %}
78+
{% tab 'Scala 2' %}
79+
80+
```scala mdoc:fail
81+
object A {
82+
def func(x: Int = 34): Unit
83+
def func(y: String = "abc"): Unit
84+
}
85+
```
86+
87+
{% endtab %}
88+
{% tab 'Scala 3' %}
89+
90+
```scala
91+
object A:
92+
def func(x: Int = 34): Unit
93+
def func(y: String = "abc"): Unit
94+
```
95+
96+
{% endtab %}
97+
{% endtabs %}
98+
99+
Если мы вызываем `A.func()`, компилятор не может узнать,
100+
намеревался ли программист вызвать `func(x: Int = 34)` или `func(y: String = "abc")`.

0 commit comments

Comments
 (0)