我是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绑定的参数值传递给f和f2.
() => 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.
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 " 的含义变为:
左转然后右转.
这意味着如果你有一个"()=>",你可以不采取任何东西(即没有参数),然后做右边的任何事情.
这是最常见的含义.
=>是"功能箭头".它既可用于函数类型签名,也可用于匿名函数术语.() => Unit是一种简写Function0[Unit],它是不带参数并且没有任何有用的函数类型(就像void在其他语言中一样).
| 归档时间: |
|
| 查看次数: |
51053 次 |
| 最近记录: |