2016-10-12 12 views
0

私はスカラ関数のリテラルフォーマットを研究するために単体テストを行いましたが、それはかなり混乱していました。別の構文の意味を理解してもらえますか?scala関数リテラル混同

@Test def supplierLiteral: Unit = { 
    object Taker { 

     def takeFunctionLiteral(supplier: => Int): Unit = { 
      println("taker takes") 
      //    println(supplier.apply()) //can't compile 
      println(supplier) 
     } 

     def takeExplicitFunction0(supplier:() => Int): Unit = { 
      println("taker takes") 
      println(supplier()) 
     } 
    } 

    val give5:() => Int =() => { 
     println("giver gives") 
     5 
    } 


    println(give5.isInstanceOf[Function0[_]]) 

    Taker.takeFunctionLiteral(give5) //can't compile, expected Int 
    println() 
    Taker.takeExplicitFunction0(give5) 
} 

なぜtakeFunctionLiteralprintln(suppiler.apply())正しくない構文がありますか? どちらも同じではありませんか?事前に

supplier:() => Int 

supplier: => Int 

感謝の違いは何ですか。

+1

参照http://stackoverflow.com/questions/32802104/some-questions-about-difference-between-call-by-name-and-0-arity-functions – Yawar

答えて

0

ここでsupplier:() => IntsupplierのタイプはFunction0[Int]です。 しかし、ここでsupplier: => IntsupplierのタイプはIntです。

supplier: => Int(a)およびsupplier: Int(B)との差は、ケース(a)において供給者パラメータは名前によって機能に渡され、内部関数からアクセスする場合にのみ評価されることです。 (b)の場合、関数が呼び出された行でサプライヤパラメータが評価されます。