Я новичок в Scala, и мне это очень нравится, но иногда это меня удивляет. Например:
clickedCallbacks: List[() => Unit])
Может ли кто-нибудь сказать мне, что означают =>
и () =>
в Scala?
Я новичок в Scala, и мне это очень нравится, но иногда это меня удивляет. Например:
clickedCallbacks: List[() => Unit])
Может ли кто-нибудь сказать мне, что означают =>
и () =>
в Scala?
=>
- синтаксический сахар для создания экземпляров функций. Напомним, что каждая функция из scala является экземпляром класса.
Например, тип Int => String
, эквивалентен типу Function1[Int,String]
, то есть функции, которая принимает аргумент типа Int
и возвращает a String
.
scala> val f: Function1[Int,String] = myInt => "my int: "+myInt.toString
f: (Int) => String = <function1>
scala> f(0)
res0: String = my int: 0
scala> val f2: Int => String = myInt => "my int v2: "+myInt.toString
f2: (Int) => String = <function1>
scala> f2(1)
res1: String = my int v2: 1
Здесь myInt
привязывается к значению аргумента, переданному в f
и f2
.
() => T
- это тип функции, которая не принимает аргументов и возвращает a T
. Это эквивалентно Function0[T]
. ()
называется списком нулевых параметров, который я считаю.
scala> val f: () => Unit = () => { println("x")}
f: () => Unit = <function0>
scala> f()
x
scala> val f2: Function0[Unit] = () => println("x2")
f: () => Unit = <function0>
scala> f2()
x2
=>
имеет несколько значений в Scala, все они связаны с его математическим значением как импликацией.
В значении он вводит литерал функции или лямбда. например бит внутри фигурных скобок в List(1,2,3).map { (x: Int) => x * 2 }
В типе с символами с обеих сторон стрелки (например, A => T
, (A,B) => T
, (A,B,C) => T
и т.д.) он сахара для Function<n>[A[,B,...],T]
, то есть функции, которая принимает параметры типа A[,B...]
и возвращает значение типа T
.
Пустые парнеры в левой части (например, () => T
) указывают, что функция не принимает никаких параметров (также иногда называемых "thunk" );
Пустые парнеры в правой части означают, что он возвращает ()
— единственное значение типа Unit
, чье имя также можно записать ()
—:)
Функция, возвращающая Unit, также известна как процедура, обычно метод, вызывающий только его побочный эффект.
В объявлении типа для параметра метода или функции, без символа в левой части (например, def f(param: => T)
), это параметр "по имени", что означает, что он оценивается каждый раз, когда он используется в тело функции, а не раньше. Обычные параметры "по значению" оцениваются перед входом в функцию/метод.
В предложении case
они отделяют шаблон (и дополнительную защиту) от выражения результата, например. case x => y
.
() => Unit
означает: "Функция типа, которая не принимает никаких параметров и не возвращает ничего"
Итак, если вы объявляете значение f
функцией, которая не принимает никаких параметров и не возвращает ничего, ее тип был бы следующим:
val f : () => Unit
Так как это val
, вам нужно назначить значение, например функцию, которая печатает Hola mundo
val f : () => Unit = () => println("Hola Mundo")
Это гласит: * "f - это функция, которая не принимает никаких параметров и не возвращает ничего инициализированного кодом println("Hola Mundo")
Так как в Scala вы можете использовать вывод типа, который вам не нужно объявлять, чтобы следующее было эквивалентно:
val f = () => println("Hola Mundo")
Чтобы вызвать его, вы можете просто:
f()
>"Hola mundo"
Или, поскольку функции также являются объектами, вы можете вызвать метод apply
:
f.apply()
> "Hola Mundo"
Вот почему в вашей декларации вы говорите: "У меня будет список, который будет содержать функции без параметров и типов возврата", следовательно List [() = > Unit]
Надеюсь, это поможет.
=>
- это "стрелка функции". Он используется как в сигнатурах типа функции, так и в терминах анонимных функций. () => Unit
является сокращением для Function0[Unit]
, который является типом функций, которые не принимают аргументов и не возвращают ничего полезного (например, void
на других языках).
В качестве наиболее упрощенного ответа вы можете заменить все, что есть в левой части = > , словом "LEFT" и все, что находится справа, со словом "RIGHT".
Тогда значение " LEFT = > RIGHT" становится:
Возьмите LEFT, затем сделайте RIGHT.
Это означает, что если у вас есть "() = > ", что вы ничего не можете взять (то есть нет параметров), а затем делать все, что находится справа.
Это наиболее распространенное значение.