Scala中=>和()=>的含义是什么

duc*_*ped 81 scala

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

clickedCallbacks: List[() => Unit])
Run Code Online (Sandbox Code Playgroud)

谁能告诉我Scala中的含义=>() =>含义?

Car*_*mey 122

=>是用于创建函数实例的语法糖.回想一下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
Run Code Online (Sandbox Code Playgroud)

这里myInt绑定的参数值传递给ff2.

() => 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
Run Code Online (Sandbox Code Playgroud)


Ale*_*ise 90

=> 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.

  • 谢谢,我正在寻找“按名称参数”的含义,在任何其他答案中都没有提到。当需要“懒惰评估”时使用它。 (5认同)

Osc*_*Ryz 18

() => Unit意思是:"键入不带参数且不返回任何内容的函数"

因此,如果您将一个值声明为f不带参数的函数并且不返回任何类型的函数,那么它将是:

val f : () => Unit
Run Code Online (Sandbox Code Playgroud)

因为这是val你必须分配一个值,例如一个打印的函数Hola mundo

val f : () => Unit  = () => println("Hola Mundo")
Run Code Online (Sandbox Code Playgroud)

它读取:*"f是一个不带参数的函数,并且不返回任何用代码初始化的函数 println("Hola Mundo")

因为在Scala中您可以使用类型推断,所以您不必声明类型,因此以下内容是等效的:

val f = () => println("Hola Mundo")
Run Code Online (Sandbox Code Playgroud)

要调用它,您可以:

f()

>"Hola mundo"
Run Code Online (Sandbox Code Playgroud)

或者,由于函数也是对象,您可以调用该apply方法:

f.apply()
> "Hola Mundo"
Run Code Online (Sandbox Code Playgroud)

这就是为什么在你的声明中你说"我将有一个列表,它将保存没有参数和没有返回类型的函数" 因此List [()=> Unit]

我希望这有帮助.


Dam*_*jar 16

作为最简化的答案,您可以使用"LEFT"一词替换=>左侧的任何内容,并使用"RIGHT"一词替换右侧的任何内容.

然后," LEFT => RIGHT " 的含义变为:

左转然后右转.

这意味着如果你有一个"()=>",你可以不采取任何东西(即没有参数),然后做右边的任何事情.

这是最常见的含义.


Tom*_*ett 5

=>是"功能箭头".它既可用于函数类型签名,也可用于匿名函数术语.() => Unit是一种简写Function0[Unit],它是不带参数并且没有任何有用的函数类型(就像void在其他语言中一样).