Я слышал, что Scala содержит функцию с именем named и аргументами по умолчанию, но я не знаю, что делают эти параметры и как их использовать.Что такое имена и аргументы по умолчанию?
Может кто-нибудь объяснить их использование?
Я слышал, что Scala содержит функцию с именем named и аргументами по умолчанию, но я не знаю, что делают эти параметры и как их использовать.Что такое имена и аргументы по умолчанию?
Может кто-нибудь объяснить их использование?
Некоторые специальные функции тип вызова в Scala
Именованные аргументы:
Именованные аргументы позволяют передать аргументы функции в другой order.For пример:
def speed(distance: Float, time: Float): Float = distance/time
И его можно использовать следующим образом:
speed(distance = 100, time = 10)
или
аргументыspeed(time = 10, distance = 100)
По умолчанию:
Scala позволяет определить значения по умолчанию для параметров функции. Например:
def printTime(out: java.io.PrintStream = Console.out) =
out.println("time = "+ System.currentTimeMillis())
Тогда вы можете вызвать PrintTime без какого-либо выходного потока, как это:
printTime()
Повторные аргументы:
Scala позволяет указать, что последний параметр к функция может быть повторена. Например:
def echo(args: String*) =
for (arg <- args)
println(arg)
Затем вы можете использовать его как это:
echo()
echo("one")
echo("hello", "world!")
Аргументы по умолчанию решают проблему, которую другие языки программирования обычно решают при перегрузке метода. Когда есть метод
def addNumbers(a: Int, b: Int, c: Int, d: Int) = a+b+c+d
, которая принимает несколько параметров, это может быть полезно установить некоторые значения по умолчанию в перегруженных методов для обеспечения API, который проще в использовании, если один не хочет, чтобы заполнить все параметры:
def addNumbers(a: Int, b: Int, c: Int) = addNumbers(a, b, c, 0)
def addNumbers(a: Int, b: Int) = addNumbers(a, b, 0, 0)
с аргументами по умолчанию это уже не нужно перегружать такой метод:
def addNumbers(a: Int, b: Int, c: Int = 0, d: Int = 0) = a+b+c+d
компилятор автоматически вызывает метод с конкретной арг по умолчанию если они не указаны:
scala> addNumbers(1, 2, 3)
res2: Int = 6
Полезное место для аргументов по умолчанию в конструкторах. Легче написать
class A(i: Int, s: String = "")
чем
class A(i: Int, s: String) {
def this(i: Int) = this(i, "")
}
Именованные аргументы другой стороны может улучшить читаемость вызова метода:
def compute(xs: List[Int], executeInParallel: Boolean) = ???
compute(xs, executeInParallel = true)
легче читать чем только compute(xs, true)
Всегда можно указать имя параметра независимо от его порядка. Это означает, что compute(executeInParallel = true, xs = xs)
совпадает с compute(xs, true)
. Компилятор часто просто нуждается в подсказке, какой параметр должен быть помещен в какую позицию при изменении порядка параметров.
Прецедент, когда оба имени и аргументы по умолчанию могут быть использованы ложь в методе копирования тематических классов, которые автоматически генерируются компилятором:
scala> case class Person(name: String, age: Int)
defined class Person
scala> val p = Person("Ruben", 43)
p: Person = Person(Ruben,43)
scala> val oneYearOlder = p.copy(age = p.age+1)
oneYearOlder: Person = Person(Ruben,44)
Это может быть важно упомянуть, что именованные аргументы работают только для методов, определенных в Scala. Параметры методов, определенных в Java, не могут быть вызваны их именем.
Кроме того, названные аргументы не работают на функциональных литералов:
scala> val f = (i: Int) => i
f: Int => Int = <function1>
scala> f(i = 1)
<console>:9: error: not found: value i
f(i = 1)
^
Для получения дополнительной информации по этой функции один взглянуть на docs.scala-lang.org может.