Tour of Scala

Значения Параметров По умолчанию

Language

Scala предоставляет возможность задавать значения параметров по умолчанию, что позволяет лишний раз не указывать параметры.

def log(message: String, level: String = "INFO") = println(s"$level: $message")

log("System starting")  // выведет "INFO: System starting"
log("User not found", "WARNING")  // выведет "WARNING: User not found"

У параметра level есть значение по умолчанию, поэтому он необязателен. В последней строке аргумент "WARNING" переназначает аргумент по умолчанию "INFO". Вместо того чтоб использовать перегруженные методы в Java, вы можете просто указать дополнительные параметры как параметры по умолчанию для достижения того же эффекта. Однако, если при вызове пропущен хотя бы один аргумент, все остальные аргументы должны вызываться с указанием конкретного имени аргумента.

class Point(val x: Double = 0, val y: Double = 0)

val point1 = new Point(y = 1)

Так мы можем указать что y = 1.

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

// Point.scala
class Point(val x: Double = 0, val y: Double = 0)
// Main.java
public class Main {
    public static void main(String[] args) {
        Point point = new Point(1);  // не скомпилируется
    }
}

Параметры по умолчанию для перегруженных методов

Scala не позволяет определять два метода с параметрами по умолчанию и с одинаковым именем (перегруженные методы). Важная причина этого - избежание двусмысленности, которая может быть вызвана наличием параметров по умолчанию. Чтобы проиллюстрировать проблему, давайте рассмотрим определение методов, представленных ниже:

object A {
  def func(x: Int = 34): Unit
  def func(y: String = "abc"): Unit
}
object A:
  def func(x: Int = 34): Unit
  def func(y: String = "abc"): Unit

Если мы вызываем A.func(), компилятор не может узнать, намеревался ли программист вызвать func(x: Int = 34) или func(y: String = "abc").

Contributors to this page: