scala 中的 => T参数

464 阅读1分钟

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类型的,传入参数的一瞬间不会执行计算,而当每次用到的时候,都会重新计算一次。