Scala中的=>和()=>是什么意思
我是新来的斯卡拉,我真的很喜欢它,但有时它让我感到惊讶。 例如:
clickedCallbacks: List[() => Unit])
任何人都可以告诉我什么=>
和() =>
在斯卡拉的意思?
=>
是用于创build函数实例的语法糖。 回想一下,scala中的每个函数都是一个类的实例。
例如, Int => String
types等价于Function1[Int,String]
typesFunction1[Int,String]
即接受Int
types参数并返回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
的函数的types。 它相当于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中有几个含义,都和它的math含义有关。
-
在一个值中,它引入了一个函数literal,或lambda 。 例如
List(1,2,3).map { (x: Int) => x * 2 }
大括号内的位。 -
(A,B) => T
,(A,B,C) => T
等等),对于Function<n>[A[,B,...],T]
是一个糖,Function<n>[A[,B,...],T]
,即一个接受typesA[,B...]
参数并返回typesT
的值的函数。-
在左边的空包(例如
() => T
)表示该函数不带参数(有时也称为“thunk”)。 -
在右边的空parens表示它返回
()
– typesUnit
的唯一值,其名称也可以被写入()
还有吗? 🙂一个返回Unit的函数也被称为一个过程 ,通常是一个只为了副作用而被调用的方法。
-
-
在方法或函数参数的types声明中,左边没有符号(例如
def f(param: => T)
),它是一个“by-name参数”,意思是每次在function的身体,而不是之前。 在进入函数/方法之前评估普通的“按值”参数。 -
在一个
case
子句中,他们将模式(和可选的后卫)与结果expression式分开,例如case x => y
。
() => Unit
表示: “input不带参数且不返回任何内容的函数”
所以如果你声明一个值f
是一个不带参数的函数并且不返回,它的types将是:
val f : () => Unit
由于这是一个val
你必须指定一个值,例如打印Hola mundo
的函数
val f : () => Unit = () => println("Hola Mundo")
它的内容如下:*“f是一个函数,它不接受参数,并返回没有用代码println("Hola Mundo")
初始化的东西
因为在Scala中你可以使用types推断,所以你不必声明types,所以下面是等价的:
val f = () => println("Hola Mundo")
要调用它,你可以:
f() >"Hola mundo"
或者,由于函数也是对象,所以可以调用apply
方法:
f.apply() > "Hola Mundo"
这就是为什么在你的声明中,你会说“我将有一个列表,它将保存没有参数和不返回types的函数”,因此List [()=> Unit]
我希望这有帮助。
=>
是“function箭头”。 它既用于函数types签名也用于匿名函数。 () => Unit
是Function0[Unit]
的简写forms,它是不带任何参数的函数的types,并且不返回任何有用的内容(如其他语言中的void
)。
作为最简单的答案,您可以将=>左侧的所有内容replace为单词“LEFT”,而右侧的任何单词都可以replace为“RIGHT”。
那么,“ LEFT => RIGHT ”的含义就变成:
左转,然后右转。
这意味着如果你有一个“()=>”,你可以不采取任何措施(也就是没有参数),然后做任何事情在右边。
这是最常见的意思。