【发布时间】:2018-04-06 13:21:01
【问题描述】:
【问题讨论】:
标签: scala
【问题讨论】:
标签: scala
表示可以运行的代码块。
例如:
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。
【讨论】:
op 被称为按名称调用 参数(与按值 相对)。请注意,写doTwice(println("Hi")) 也同样有效。当你在 Scala 中调用一个函数时,语法不会指明你是通过 name 还是通过 value 传递参数。
它表示两件事。首先,由于前缀=>,表示参数将传递by name。则表示传递的参数类型必须为SomeType。
有些人将两者混为一谈,认为=> SomeType 本身就是一种类型——它不是。它是两件事的结合:参数评估策略和参数类型。
所以,请按名称简要说明,以防维基百科链接不清楚,如果你有这个:
def f[A](x: => A) = { x; x }
f(some stuff)
然后 Scala 会这样执行:
{ some stuff; some stuff }
在按值调用时,发生的情况更像是这样:
val x = some stuff
{ x; x }
还要注意,参数总是在调用时按值评估,但只评估一次。在按名称调用时,参数可能从不被评估(例如,如果它位于if 的非执行分支上),但可能会被评估多次。
【讨论】:
f 时未知的类型,但在使用f 时将是已知的。函数f 对所有类型A 都有效,并且在这种情况下,A 可以是什么没有任何限制。我可以使用A <: SomeConcreteType 来指示下边界(A 必须是SomeConcreteType 或其子类型),A >: SomeOtherType(A 必须是SomeOtherType 的超类),以及指示@ 987654340@ 必须是某个隐式参数的一部分,这会导致对 A 的任意限制。
它只是一种不带参数的函数值。 Owen 的例子很酷,只要知道“A => B”是一个函数,其参数类型为 A,返回值类型为 B,而“=> B”是一个函数不带参数,返回类型为 B 的值。
【讨论】: