2013-03-29 154 views
0

我已經定義了一個特質像以下特質的行爲,無法理解

trait Log { 
    val logEnabled: Boolean 
    def log(msg: String) { 
    if(logEnabled) { 
     println(msg) 
    } 
    } 
} 

,並希望使用類似以下內容:

def log(enabled: Boolean)(msg: String) = new Log(){ 
    val logEnabled = enabled 
} 
implicit val enabled = true; 
val log1 = log(true) _ 
log1("hi, world") 

但結果卻是空白,什麼都沒有打印輸出,而不是我認爲它應該是什麼。

請問有人能解釋一下這背後的機制嗎?

回答

1

您的代碼上面,log1("hi, world"),實際上不叫Log.log功能,但在Log實例導致只是。這是因爲調用curried函數:

def log(enabled: Boolean)(msg: String) = new Log(){ ... } 
val log1 = log(true) _ 

產生一個函數,給定一個字符串將返回一個Log。

你可能想要的是:

trait Log { 
    val logEnabled: Boolean 
    def apply(msg: String) { 
    if(logEnabled) { 
     println(msg) 
    } 
    } 
} 

def log(implicit enabled: Boolean) = new Log(){ 
    val logEnabled = enabled 
    } 
implicit val enabled = true 
val log1 = log 
log1("hi, world") 

注意如何運用方法被調用日誌來代替。

+0

非常感謝。我現在明白了。 – user1484819