什么=>和()=>斯卡拉意味着什么

时间:2011-08-05 05:38:18

标签: scala

我是Scala的新手,我非常喜欢它,但有时候让我感到惊讶。例如:

clickedCallbacks: List[() => Unit])

有人能告诉我Scala中的=>() =>是什么意思吗?

5 个答案:

答案 0 :(得分:114)

=>是用于创建函数实例的语法糖。回想一下scala中的每个函数都是一个类的实例。

例如,类型Int => String等同于类型Function1[Int,String],即采用类型为Int的参数并返回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绑定到传递给ff2的参数值。

() => T是不带参数的函数类型,返回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

答案 1 :(得分:85)

=>在Scala中有几个含义,都与其数学意义有关。

  • 在值中,它引入了函数文字或 lambda 。例如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

答案 2 :(得分:17)

() => 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 [()=&gt; Unit]

我希望这会有所帮助。

答案 3 :(得分:10)

作为最简化的答案,您可以替换=&gt;左侧的任何内容。用&#34; LEFT&#34;以及“#34; RIGHT&#34;”这个词在右侧的任何内容。

然后,&#34; LEFT =&gt;的含义RIGHT &#34;变为:

左转然后右转。

这意味着如果您有&#34;()=&gt;&#34;你什么都不带(也就是说,没有参数),然后在右边做任何事情。

这是最常见的含义。

答案 4 :(得分:5)

=>是“功能箭头”。它既可用于函数类型签名,也可用于匿名函数术语。 () => UnitFunction0[Unit]的简写,这是一种函数类型,它不带任何参数并且不返回任何有用的内容(例如void在其他语言中)。