Что означает этот фрагмент кода в Scala? - PullRequest
3 голосов
/ 26 июня 2010
def func(arg: String => Int): Unit = {
    // body of function
}

Я имею в виду этот фрагмент: String => Int

Ответы [ 3 ]

9 голосов
/ 26 июня 2010

Краткий ответ

Это функция, которая получает строку и возвращает Int

Длинный ответ

В Scala функции являются гражданами первого класса. Это означает, что вы можете хранить их в переменных или (как в этом случае) передавать их в качестве аргументов.

Вот как выглядит литерал функции

() => Unit

Это функция, которая не получает аргументов и возвращает Unit (эквивалент Java для void).

Это будет функция, которая получает String в качестве параметра и возвращает Int:

(String) => Int

Кроме того, scala позволяет отбросить скобки как форму синтаксического сахара, как в вашем примере. Предыдущий arg: является просто именем аргумента.

Внутри func вы бы вызвали полученную функцию (arg) следующим образом:

val result = arg("Some String") // this returns a Int
4 голосов
/ 26 июня 2010

Вы также можете увидеть его написанным (возможно, декомпилятором) как

def func(arg: Function1[String, Int]): Unit = {
    // body of function
}

Они точно эквивалентны.

4 голосов
/ 26 июня 2010

Как уже упоминалось в Преимущества системы типов Scala , это Функциональный тип .

В статье Scala для Java-беженцев. Часть 6. Переход через Java описывает этот синтаксис в разделе «Функции высшего порядка».

def itrate(array:Array[String], fun:(String)=>Unit) = {
  for (i <- 0 to (array.length - 1)) {    // anti-idiom array iteration
    fun(array(i))
  }
}

val a = Array("Daniel", "Chris", "Joseph", "Renee")
iterate(a, (s:String) => println(s))

См? Синтаксис настолько естественный, что вы его почти пропускаете.
Начиная сверху, мы смотрим на тип забавного параметра и видим синтаксис (type1, …)=>returnType, который указывает на функциональный тип.
В этом случае fun будет функционалом, который принимает один параметр типа String и возвращает Unit (фактически void, так что вообще ничего).
В двух строках функции мы видим синтаксис фактического вызова функционала. fun обрабатывается так же, как если бы это был метод, доступный в области видимости, синтаксис вызова идентичен.
Ветераны эпохи C / C ++ распознают этот синтаксис как напоминающий о том, как указатели на функции обрабатывались в прошлом.
Разница в том, что не нужно беспокоиться об утечках памяти и слишком многословности, вызванной слишком большим количеством звездных символов.


В вашем случае: def func(arg: String => Int): Unit, arg будет функцией, принимающей строку и возвращающей Int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...