2017-04-07 116 views
4

任何人都知道爲什麼下面的代碼不起作用?Kotlin解包函數編譯器錯誤

private fun wrapLogIfNeeded(buildMessageOnCurrentThread: Boolean, log:() -> String):() -> String 
    return if(buildMessageOnCurrentThread) { 
    val message = log() // Type mismatch: Required() -> String Found: Unit 
    { message } 
    } 
    else { 
    log 
    } 
} 

但這:

private fun wrapLogIfNeeded(buildMessageOnCurrentThread: Boolean, log:() -> String):() -> String 
    return if(buildMessageOnCurrentThread) { 
    val message = lazy { log() }.value 
    { message } 
    } 
    else { 
    log 
    } 
} 

回答

6

這是因爲語法歧義:

val message = log() 
{ message } 

這段代碼被解析,如果它是val message = log() { message },就是log調用拉姆達{ message }作爲其論據。並且語句val message = ...的類型爲Unit,因此爲錯誤消息。作爲替代

val message = log(); 
{ message } 
+1

到分號,可以更換拉姆達'{消息}'與[匿名功能](HTTPS:

要解決它,可以添加一個分號// kotlinlang。 org/docs/reference/lambdas.html#anonymous-functions):'fun()= message'。 – mfulton26