我是Scala的新手,我非常喜欢它,但有时候让我感到惊讶。例如:
clickedCallbacks: List[() => Unit])
有人能告诉我Scala中的=>
和() =>
是什么意思吗?
答案 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
绑定到传递给f
和f2
的参数值。
() => 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)
=>
是“功能箭头”。它既可用于函数类型签名,也可用于匿名函数术语。 () => Unit
是Function0[Unit]
的简写,这是一种函数类型,它不带任何参数并且不返回任何有用的内容(例如void
在其他语言中)。