2013-05-06 2 views

ответ

5

Некоторые специальные функции тип вызова в 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!") 
1

Аргументы по умолчанию решают проблему, которую другие языки программирования обычно решают при перегрузке метода. Когда есть метод

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 может.

Смежные вопросы