按名称参数或功能?

时间:2013-11-09 13:48:35

标签: scala

我发现名字参数和功能非常相似。第一个对第二个有什么优势?

object ws1 {
  def myByFunc(f: () => Int) = f()                //> myByFunc: (f: () => Int)Int
  def myByName(f: => Int) = f                     //> myByName: (f: => Int)Int

  def testFunc(a: Int) = a * a                    //> testFunc: (a: Int)Int

  myByFunc(() => testFunc(123))                   //> res0: Int = 15129
  myByName(testFunc(123))                         //> res1: Int = 15129

}

更新: 关于每个人执行多少次的问题:

object ws1 {
  def myByFunc(f: () => Int) = {
    println("111111111 myByFunc")
    f()
  }                                               //> myByFunc: (f: () => Int)Int

  def myByName(f: => Int) = {
    println("22222222 myByName")
    f
  }                                               //> myByName: (f: => Int)Int

  def testFunc(a: Int) = a * a                    //> testFunc: (a: Int)Int

  myByFunc(() => testFunc(123))                   //> 111111111 myByFunc
                                                  //| res0: Int = 15129
  myByName(testFunc(123))                         //> 22222222 myByName
                                                  //| res1: Int = 15129
}

由于某种原因,他们都执行了一次。为什么呢?

UPDATE2: 他们都没有被评估:

object ws1 {
  def myByFunc(f: () => Int) = {
    println("111111111 myByFunc")
  }                                               //> myByFunc: (f: () => Int)Unit

  def myByName(f: => Int) = {
    println("22222222 myByName")
  }                                               //> myByName: (f: => Int)Unit

  def testFunc(a: Int) = {
    println("hello from test func")
    123456
  }                                               //> testFunc: (a: Int)Int

  myByFunc(() => testFunc(123))                   //> 111111111 myByFunc
  myByName(testFunc(123))                         //> 22222222 myByName
}

1 个答案:

答案 0 :(得分:1)

看起来很相似但意图不同:

  • () => Int函数,更确切地说是Function0:它不带参数并返回Int。函数的执行通过调用f()来触发。

  • => Int参数,使用按名称调用技术传递:评估将是懒。永远无法评估代码:def myByName(f: => Int) = 1或多次评估:def myByName(f: => Int) = f * f

要获得更完整的解释,请查看以下问题:What's the difference between => , ()=>, and Unit=>