它表示一块可以运行的代码。
例如:
scala> def doTwice(op: =>Unit) = {op; op}
doTwice: (op: => Unit)Unit
scala> doTwice({println("Hi")})
Hi
Hi
在这种情况下,=>Unit
是{println("Hi")}
。在这里,“SomeType”是Unit,因为println
没有产生任何值。如果它产生一个Int
,那么它会是=>Int
。=>
,它表示参数将通过按名称传递。然后,它指示所传递的参数类型必须为SomeType
。=> SomeType
本身就是一种类型——它不是。它是两个东西的结合:参数评估策略和参数类型。def f[A](x: => A) = { x; x }
f(some stuff)
{ some stuff; some stuff }
在值传递时,发生的事情更类似于这样:
val x = some stuff
{ x; x }
f
的时候不知道的一种类型,但是在使用 f
的时候会知道。函数 f
对于所有类型 A
都是有效的,在这种情况下,没有关于 A
可以是什么的限制。我可以使用 A <: SomeConcreteType
来表示一个下界(A
必须是 SomeConcreteType
或其子类型),A >: SomeOtherType
(A
必须是 SomeOtherType
的超类),以及指示 A
必须是某个隐式参数的一部分,这会导致对 A
可以是什么的任意限制。 - Daniel C. Sobral它只是一种不带参数的函数值类型。Owen的例子很棒,只需要知道"A => B"是一个带有类型A参数和返回类型B的函数,而"=> B"是一个不带参数且返回类型为B的函数。
doTwice(println(“Hi”))
同样有效。在Scala中调用函数时,语法不表明您是按名称还是按值传递参数。 - Kipton Barros