1

名前によるパラメーターと関数は非常に似ていることがわかりました。2番目のものに対する最初のものの利点は何ですか?

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
}

何らかの理由で、両方とも1回実行されます。なんで?

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
}
4

1 に答える 1

1

似ているように見えますが、意図は異なります:

  • () => Int関数です。より正確にはFunction0、パラメータをとらず、 を返しますInt。関数の実行は、f() の呼び出しによってトリガーされます。

  • => Intパラメーターであり、名前による呼び出し手法で渡されます:評価は遅延します。コードは決して評価できません :def myByName(f: => Int) = 1または複数回評価できます : def myByName(f: => Int) = f * f

より完全な説明については、この質問を見てください: => 、 ()=>、および Unit=> の違いは何ですか?

于 2013-11-09T14:09:49.753 に答える