3

我是 scala 语言的新手,因此如果有人能向我解释这个代码片段,我将不胜感激:

object C  {

  def main(args: Array[String]) = {
    measure("Scala"){
      println("Hello Back")
    }
  }

  def measure(x: String)(y: => Unit){
   println("Hello World " + x)
  }
}

控制台输出:

Hello World Scala

我的问题是为什么程序没有打印出来Hello Back?也是函数/对象;其主体是指令println("Hello Back");存储在堆的某个地方?

4

2 回答 2

6

名称参数与普通参数的区别在于,无论何时使用参数,都会计算参数表达式。因此,如果您使用它两次,则表达式会被计算两次。如果你根本不使用它,它就永远不会被评估。

因此,在您的情况下,不会打印“Hello Back”,因为您从不使用y.

也是函数/对象;其主体是指令 println("Hello Back"); 存储在堆的某个地方?

按名称参数生成的代码与函数相同,因此它将在堆上创建一个函数对象。

于 2016-11-22T02:12:58.300 回答
3
{
      println("Hello Back")
}

这是一个代码块,等于:

def f = {println("Hello World")}
measure("Scala")(f)

所以对于measure方法,你需要显式调用:

  def measure(x: String)(y: => Unit){
   println("Hello World " + x)
   y
  }
于 2016-11-22T01:48:12.997 回答