2017-04-07 88 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