Scala中的=>和()=>是什么意思

我是新来的斯卡拉,我真的很喜欢它,但有时它让我感到惊讶。 例如:

clickedCallbacks: List[() => Unit]) 

任何人都可以告诉我什么=>() =>在斯卡拉的意思?

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

例如, Int => Stringtypes等价于Function1[Int,String]typesFunction1[Int,String]即接受Inttypes参数并返回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的函数的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签名也用于匿名函数。 () => UnitFunction0[Unit]的简写forms,它是不带任何参数的函数的types,并且不返回任何有用的内容(如其他语言中的void )。

作为最简单的答案,您可以将=>左侧的所有内容replace为单词“LEFT”,而右侧的任何单词都可以replace为“RIGHT”。

那么,“ LEFT => RIGHT ”的含义就变成:

左转,然后右转。

这意味着如果你有一个“()=>”,你可以不采取任何措施(也就是没有参数),然后做任何事情在右边。

这是最常见的意思。