Scala в примерах: различия между версиями

Содержимое удалено Содержимое добавлено
Правка орфографии
→‎Кортежи: — перевод параграфа
Строка 911:
 
== Кортежи ==
 
Иногда функция должна возвращать больше одного результата. Например, функция <tt>divmod</tt>, которая возвращает целочисленные частное и остаток от деления двух аргументов. Конечно, можно определить класс для хранения двух результатов <tt>divmod</tt>:
 
<font size=3><syntaxhighlight lang=Scala>
case class TwoInts(first: Int, second: Int)
def divmod(x: Int, y: Int): TwoInts = new TwoInts(x / y, x % y)
</syntaxhighlight></font>
 
Но заводить новый класс для каждой возможной пары результатов очень утомительно. В Scala можно вместо этого использовать обобщенный класс <tt>Tuple2</tt>, который определен следующим образом:
 
<font size=3><syntaxhighlight lang=Scala>
package scala
case class Tuple2[A, B](_1: A, _2: B)
</syntaxhighlight></font>
 
С <tt>Tuple2</tt> метод <tt>divmod</tt> можно написать так:
 
<font size=3><syntaxhighlight lang=Scala>
def divmod(x: Int, y: Int) = new Tuple2[Int, Int](x / y, x % y)
</syntaxhighlight></font>
 
Как обычно, типовые параметры конструкторов можно опустить, если они выводимы из аргументов. Есть также кортежные классы для любого другого количества элементов (нынешняя реализация Scala ограничивает кортежи по длине некоторым большим числом).
 
Как обращаться к элементам кортежей? Поскольку кортежи — это case-классы, есть две возможности. Можно либо обращаться к полям кортежа, используя имена параметров конструктора ''_i'', как в этом примере:
 
<font size=3><syntaxhighlight lang=Scala>
val xy = divmod(x, y)
println("quotient: " + xy._1 + ", rest: " + xy._2)
</syntaxhighlight></font>
 
Либо использовать сопоставление с образцом, как здесь:
 
<font size=3><syntaxhighlight lang=Scala>
divmod(x, y) match {
case Tuple2(n, d) =>
println("quotient: " + n + ", rest: " + d)
}
</syntaxhighlight></font>
 
Заметьте, что типовые параметры никогда не используются в образцах, писать <tt>caseTuple2[Int, Int](n, d)</tt> — нельзя.
 
Кортежи так удобны, что у Scala есть для них специальный синтаксис. Чтобы сформировать кортеж с ''n'' элементами ''x<sub>1</sub>'', ''...'', ''x<sub>n</sub>'', можно написать (''x<sub>1</sub>'', ''...'', ''x<sub>n</sub>''). Такая запись эквивалентна <tt>Tuple</tt>''n''(''x<sub>1</sub>'', ''...'', ''x<sub>n</sub>''). Синтаксис (...) работает одинаково для кортежей и паттернов. С таким кортежным синтаксисом пример <tt>divmod</tt> можно записать так:
 
<font size=3><syntaxhighlight lang=Scala>
def divmod(x: Int, y: Int): (Int, Int) = (x / y, x % y)
divmod(x, y) match {
case (n, d) => println("quotient: " + n + ", rest: " + d)
}
</syntaxhighlight></font>
 
== Функции ==