Что означает => и() => значение в Scala

Я новичок в Scala, и мне это очень нравится, но иногда это меня удивляет. Например:

clickedCallbacks: List[() => Unit])

Может ли кто-нибудь сказать мне, что означают => и () => в Scala?

Ответ 1

=> - синтаксический сахар для создания экземпляров функций. Напомним, что каждая функция из 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

Ответ 2

=> имеет несколько значений в 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.

Ответ 3

() => 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]

Надеюсь, это поможет.

Ответ 4

=> - это "стрелка функции". Он используется как в сигнатурах типа функции, так и в терминах анонимных функций. () => Unit является сокращением для Function0[Unit], который является типом функций, которые не принимают аргументов и не возвращают ничего полезного (например, void на других языках).

Ответ 5

В качестве наиболее упрощенного ответа вы можете заменить все, что есть в левой части = > , словом "LEFT" и все, что находится справа, со словом "RIGHT".

Тогда значение " LEFT = > RIGHT" становится:

Возьмите LEFT, затем сделайте RIGHT.

Это означает, что если у вас есть "() = > ", что вы ничего не можете взять (то есть нет параметров), а затем делать все, что находится справа.

Это наиболее распространенное значение.