2013-11-09 109 views
1

我發現名稱參數和功能非常相似。第一個與第二個的優勢是什麼?名稱參數或功能?

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 

} 

UPDATE: 至於有多少次,每次他們的執行問題:

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 
} 

回答

0

它看起來相似,但其目的是不同的:

  • () => Int功能,更確切地說Function0:它不帶參數並返回Int。函數的執行通過調用f()來觸發。

  • => Int參數,具有的call-by-名技術傳遞:該評價會偷懶。該代碼無法評估:def myByName(f: => Int) = 1或多次評估:def myByName(f: => Int) = f * f

爲了更完整的解釋,來看看這個問題:What's the difference between => ,()=>, and Unit=>

+0

不是'()=> Int'懶惰?將不會執行'()=> Int'幾次? –

+0

'()=> Int'不是懶惰的,它是一個按值調用。該值將首先計算並傳遞給'myByFunc' –

+0

第二個問題呢? –