scala 中,有一种比较特别的参数,形式如下:
def foo[T](param: => T): Unit
我们好奇的是,该类型的参数和直接使用T的参数有什么差异?比如:
def foo1[T](param: T): Unit
因为两者都是可以传入表达式的,比如:
foo(() => 10)
foo1(() => 10)
这里最根本的差异是,如果我们传入表达式(函数),表达式的执行时间是不一样的。=> T 会延迟计算,即我们在第一次使用到的时候才会进行计算;而T 一旦传入会立刻执行计算,而且只会执行一次计算。给一个代码示例:
object TestThunk {
def main(args: Array[String]): Unit = {
def answer(): Int = {
println("answer")
10
}
def eagerEval(x: Int) = {
println("eager")
x
x
}
def lazyEval(x: => Int): Int = {
println("lazy")
x
x
}
println(eagerEval(answer()))
println("=================")
println(lazyEval(answer()))
}
}
输出结果:
answer
eager
10
=================
lazy
answer
answer
10
我们可以看出,T类型的,当传入参数的一瞬间,参数表达式就执行计算了,之后内部的x 都代指的表达式计算结果;而=> T类型的,传入参数的一瞬间不会执行计算,而当每次用到的时候,都会重新计算一次。