2013-10-22 113 views
0

都迎方法相同打電話名斯卡拉

object test { 
    def greet = { println("hi")}     //> greet: => Unit 
    def greet1(f: => Unit)= {println("hi")}   //> greet1: (f: => Unit)Unit 
} 

按我的理解迎接是不帶任何參數和返回單元和參數是按名稱調用的函數。而greet1是一個函數,它返回Unit的函數,也是一個按參數名稱調用的函數。 我很困惑,有沒有人可以解釋這種差異。

回答

5

問候是一種返回單位的方法。 在這種特殊情況下,它們在功能上做同樣的事情。 greet1將一個返回Unit的函數作爲參數,但不使用它。所以你可以打電話greet1爲:

greet1(greet) 

而作爲通過參數傳遞它不會被應用。但通常他們不是一回事。如果你改變greet1以下幾點:

def greet1(f: => Unit)= { 
    println("hi") 
    f() 
} 

調用greet1如上將打印「喜」的兩倍。或

def greet1(f: => Unit)= { 
    println("hi") 
    f() 
    f() 
} 

會打印「嗨」三次。由於每次調用參數時都會評估參數。如果你重寫greet1爲:

def greet1(f: Unit)= { 
    println("hi") 
    f 
    f 
} // and call it: 

greet1(greet) 

它只會打印「喜」兩倍的參數是按值其被評估一次且僅一次通話時調用。